- 说明
只讨论GPU瓶颈,CPU一般是tick问题,具体根据项目代码研究
- 前置知识
GPU Rendering Pipeline——GPU渲染流水线简介:熟悉渲染管线,了解图形渲染流程有助于理解优化过程,理解性能瓶颈等概念
GPU Rendering Pipeline——GPU渲染流水线简介 - 知乎
UE4是如何渲染一帧:熟悉每部分消耗的意义,以便从消耗高到低依次分析
Quick Profiling Guide:了解部分重要的控制台命令,通过开启/关闭,或调整数值,观察前后帧数差异,便于了解性能瓶颈以及优化方向
Quick Profiling Guide - Gamedev Guide
优化分析步骤
在确定是GPU瓶颈后,进一步确定是资源问题还是场景布局问题
(1)、资源问题需要研究资源是否符合当前制定的硬件平台性能标准,例如1060和2060都是60帧的情况下,2060拥有更快的数据处理能力,可以使用数据更大的资源。
一般来说,资源主要是贴图和模型、材质,贴图是分辨率及格式上优化,模型则是优化顶点、三角形数量,材质则是降低渲染指令,也可以使用LOD,对远处的物体单独设置低消耗材质。
(2)、场景布局问题主要表现在过于密集且视野开阔,对于性能降低的硬件,密集且视野开阔的场景,会使引擎需要渲染的模型数量大大增加。另一方面,开阔地形流关卡也不好做,即使远处只保留主体效果,对于较低性能显卡,依旧吃力,导致优化受限。
检查场景物件是否使用LOD和距离裁剪
如果项目是实时光影,一般低端显卡,阴影消耗占比非常高,可以考虑降低CSM数量,配合距离场阴影,或者直接烘焙,烘焙时,可以关掉杂物的动态阴影,一般不影响效果,且能明显降低阴影消耗。另外需要注意,如果使用烘焙后,阴影消耗异常的高,可能是因为方向光没有设置阴影距离,导致引擎改为用per object shadow,设置好阴影距离就正常了
对于Actor很多的场景,容易出现GPUSceneUpdate或VisibilityCommands很高的情况,这是场景中Actor太多导致更新场景物件多以及做Actor裁剪消耗高,这时可以考虑对比较碎的物件进行合并,以及把相同的Actor进行实例化,或者使用流关卡,将细节部分Actor移到流关卡并根据需求卸载
最后学会使用RenderDoc之类的抓帧软件,对渲染消耗高的场景进行抓帧分析,以便通过消耗时间这一直观的数据,来确定场景中哪些Actor消耗不合理,并对其进行优化。