在应用中发现了性能问题之后,如何解决性能问题

常见的提高CPU和GPU性能的手段

  • 良好的场景管理
  • 尽量减少绘制的数量

机器方面的功能

GPU Bottlenecks

如果应用的GPU工作时间长于目标帧数

  • Quest 13.88ms
  • Rift 11.11ms
  • Rift S 12.5ms

那就是出现了GPU受限 GPU bound

为什么不强调CPU呢,应为GPU往往先于CPU,因为GPU瓶颈,会影响CPU分析工具报告的帧数
所以最好先解决GPU性能问题,再去解决CPU问题
也就是在游戏开发环境中,先减少发送给GPU的工作量

GPU Workload

由组成场景的一系列绘制调用组成
要弄清哪个draw call可以使用renderdoc

Common Cause of Performance Impact

Vertex operation 顶点处理

降低网格体的顶点数量
或者优化顶点着色器

Fragment Operation片元处理

优化相关的像素着色器
降低纹理使用或渲染目标的维度

Oculus Quest Draw Call Stages

Binning 合并

Rendering 渲染

简单版本的顶点着色器用来计算图元位置并分配给渲染目标上的相应部分
在渲染过程中,被分配到合并绘制调用的每个顶点着色器都会重新执行
从而计算片元处理中使用的插入值,然后执行片元着色器

VS要被执行两次,所以顶点的数量要控制在合理的范围内。

材质越复杂,片元处理的计算开销越大
其中一大影响因素是从CPU中获取材质,这意味尽量少的材质种类做更多的使用和变换
在quest上,推荐每个材质少于两种纹理

BestPractise

  • Avoid using textures if you do not need to
  • Make good use of the normal map for lit materials
  • Minimize dynamic light

确保Mobile HDR关闭,开启Single-Pass linear rendering
FFR可以用来降低片元处理的消耗,目前不支持PC

CPU Bottleneck

  • Bound on the Main Thread
  • Bound on the Render Thread

Oculus Blog: Optimize Oculus Quest

如果quest出现了cpu瓶颈
项目设置中开启:

  • Mobil multi-view
  • Mobile multi-view Direct

这样可以降低提交给CPU的draw call计算开销大约50%
但是不影响GPU的工作量

降低Draw call

cpu瓶颈的主要原因
对于quest,建议多视图绘制调用不要超过50个
多视图是quest的一个功能,可以在VR中实现双眼的单词绘制调用

1 Occlusion Culling

遮蔽剔除,UE4支持的功能,默认启动

2 将多个网格体合并为一个大的网格体

这是CPU显然线程的时间和效率之间的平衡

3 降低场景复杂度

Cross Platform Guidelines for Rift and Quest

  • 如果需要光照,两个平台都应针对不会移动的场景物体使用光照贴图
  • Rift可以使用使用后期处理,有更多的动态光,阴影以及曲面细分
  • Quest英使用不同的材质,但是要引用同同样或者更低分辨率的纹理以及更低的光照质量。
  • 两个平台使用的是不同的渲染器,可以通过分别设置不同的材质,来避免修改的互相影响。
  • Quest应该使用不同的网格体,顶点数量要更少