本文翻译自:https://www.khronos.org/assets/uploads/developers/library/2019-gdc/Vulkan-Bringing-Fortnite-to-Mobile-Samsung-GDC-Mar19.pdf
由于本人才疏学浅,翻译难免有误,望各位不吝惜指正。
![e6d8afdcdafd978309b4699a98c7ac35.png](https://i-blog.csdnimg.cn/blog_migrate/95dc5d3bd0fc44954a67cbe6042a3a64.jpeg)
感谢作者为我们带来的分享:堡垒之夜的移动端优化(Vulkan与OpenGL ES)。
![c906b722c681c567a82a181455a05295.png](https://i-blog.csdnimg.cn/blog_migrate/cae34e71f8c6520f9364cd3ed2f2e1d9.jpeg)
文章内容
- 第一部分------在移动端实现堡垒之夜的挑战和我们的解决方案
- 移植堡垒之夜到移动端的挑战
- 性能
- 内存
- UE的改进
- 第二部分------堡垒之夜移动端的Vulkan实现方案
- Vulkan的优点
- 性能优化
- 缓存命中和内存占用优化
![af54506c4a148a6db502bc2d76dfe836.png](https://i-blog.csdnimg.cn/blog_migrate/514c624b4829a9024425b2be0549babb.jpeg)
完全相同的游戏体验,而不是精简版
一开始,我们的目标就是实现一个跨平台的游戏:
- 在所有平台使用相同的地图(所有平台定期同步更新)
- 对游戏玩法有影响的部分必须在所有平台支持
- 游戏的交战距离在多个平台保持一致
- 代码实现不能偏离UE4主线
![00d5781a7bf35823b3bcfae530f38a4f.png](https://i-blog.csdnimg.cn/blog_migrate/83d6fa129a76d23290de81e42c3ee695.jpeg)
堡垒之夜使用的渲染特性(PC和主机)
- 延迟渲染
- 可移动的方向光源
- CSM(级联阴影贴图)
- Ray-traced Distance Field Shadows
- 可移动的天空
- Distance Field Ambient Occlusion
- Screen Space Ambient Occlusion
- 局部光照
- 点光源+聚光灯
- 阴影
- 阴影缓存
- 材质
- 基于物理
- 次表面散射
- 双面植被
- 效果
- 体积雾
- Light Shafts
- GPU粒子模拟
- 柔化粒子
- 贴花
- 植被动画
- 后处理
- 泛光
- 对象的轮廓
- ACES Tonemapper
- 反走样
- TAA
- MSAA
斜体表示未使用的特性。
![5f5d4757adff57bf42852760dbca53fa.png](https://i-blog.csdnimg.cn/blog_migrate/1f8afed850769c29881faf1b738d44a6.jpeg)
堡垒之夜使用的渲染特性(移动端)
- 前向渲染
- 可移动的方向光源
- CSM(级联阴影贴图)
- Ray-traced Distance Field Shadows
- 可移动的天空
- Distance Field Ambient Occlusion
- Screen Space Ambient Occlusion
- 局部光照
- 点光源+聚光灯
- 阴影
- 阴影缓存
- 材质
- 基于物理
- 次表面散射
- 双面植被
- 效果
- 体积雾
- Light Shafts
- GPU粒子模拟
- 柔化粒子
- 贴花
- 植被动画
- 后处理
- 泛光
- 对象的轮廓
- ACES Tonemapper
- 反走样
- TAA
- MSAA
斜体表示未使用的特性。
![b8ed0798d4042095e57b265bd69e6aa8.png](https://i-blog.csdnimg.cn/blog_migrate/8b07cd577478ccdcc7223879d5793962.jpeg)
移动端的内容适配
- 可破坏的层次LOD
- 将多个独立的资源根据层次结构聚合成一个代理对象
- 根据距离信息使用代理对象代替原资源
- 堡垒之夜是一个允许破坏场景任意部分的游戏
- 顶点着色器根据vertex color所包含的标记信息从代理资源中剔除被破坏的几何数据
- 将多个独立的资源根据层次结构聚合成一个代理对象
![711415abfaf0c11851c4bf0c6d588425.png](https://i-blog.csdnimg.cn/blog_migrate/772f1a83ea4531ea43d998ef53e6a6e7.jpeg)
从数字角度看堡垒之夜移动端
- 渲染数据
- 场景共有80,000+对象
- 通常有10000+对象被加载
- 平均每帧800 draw call,峰值2000+ draw call
- 高端设备使用了600,000+三角形
- 场景共有80,000+对象
- Shader/PSO
- 实际使用了4300个PSO进行渲染!
- 从一个包含了28000个shader对象池获取
- 实际使用了4300个PSO进行渲染!
- 内存
- 1.2GB~2GB
- 对于不同的设备使用不同的渲染API和shader分配策略
- 1.2GB~2GB
![a9e109702102d4c001fc3febaddab761.png](https://i-blog.csdnimg.cn/blog_migrate/a076a79c010ed3a1978929e5155718c2.jpeg)
挑战
- 性能
- 内存
- 设备兼容性
![bfea2b4d718952f309e9a2614364cd6d.png](https://i-blog.csdnimg.cn/blog_migrate/d323445a14562b71c6ecf23008ceccdb.jpeg)
性能
- CPU侧优化
- draw call代价------图形API瓶颈
- 添加一个RHI线程
- 使用Vulkan取代OpenGL ES
- 减少draw call和状态改变
- 改进遮挡剔除
- 排序渲染
- 实例化渲染
- draw call代价------图形API瓶颈
- GPU侧优化
- 调整渲染内容
- 调整分辨率和帧率
- 改进渲染的代码实现
- 压缩render pass
![7b0e40213a1e2a38b9ee0a2036a857e1.png](https://i-blog.csdnimg.cn/blog_migrate/487c3b3c85df6954beab6d5a592cf224.jpeg)
draw call代价------渲染线程
- UE4包含了两个主线程
- Game Thread
- 根据玩家输入,网络数据,物理模拟更新游戏状态
- 将游戏对象的状态变化入队
- 将资源变化入队
- 发送渲染指令渲染场景
- Render Thread
- 出队游戏对象的状态变化,并将状态变化应用到代理对象上
- 创建和更新渲染资源
- 渲染场景
- Game Thread
渲染场景:
- 获取上一帧的遮挡查询结果