1.定位瓶颈
首先需要判断瓶颈在哪,UE4命令行输入stat unit
Game:处理游戏逻辑的时间
Draw:根据剔除物体,收集渲染信息发送到GPU的时间
GPU:渲染,光照计算所需要的时间
哪个时间更接近Frame的时间就从哪里入手,通常代码不出问题情况下,一般都是GPU的问题。
2.Game
如果是Game时间更接近,可以看看Tick代码是否有循环次数比较多的,或者是UE官方不建议在Tick调用的函数一直在Tick里面调用,可以把耗时的操作采用多线程的方式解决,可以使用Unreal Insights工具分析
3.Draw
如果是Draw时间更接近,可以看看是不是物体过多,导致剔除耗时过长,输入stat initviews可以查看情况。还有就是DrawCall,可以通过RenderDoc查看调用的次数,优化场景,可以把一些不需要很高精度的模型合成成1个actor
4.GPU
如果是GPU时间更接近,造成的原因比较多,往往也是主要需要优化的地方,通过RenderDoc截图帧数较低的分析,然后找到Scene节点,这里以延迟渲染为例。
可以看到主要的渲染流程就是PrePass->BasePass->ShadowDepths->Light->PostProcessing
- PrePass主要是执行对不透明物体深度测试,生成一张RT。这里的消耗主要是与actor的数量,以及actor的面数有关
2. BasePass主要根据Shader输出的颜色,高光,粗糙度等,生成一系列的RT,并存储在GBuffer里,方便后续的阴影和光照计算。这里的计算主要和shader的复杂度,以及贴图的质量有关
- Shodow和Light的计算是耗时最多的,这里和光源的数量,actor的数量,模型的精度都有这密切的关系,具体情况需要具体分析
- PostProcessing主要是对输出的画面做处理,与后处理盒子的数量和后处理的Shader有关系
总结:根据RederDoc所反馈的信息,调整耗时高的步骤和DrawCall。通常情况下优化性能,都是从GPU入手,DrawCall是最消耗时间的,减少DrawCall是最有效的优化方法。对于大世界场景建议使用UE5的Nanite,以及一些不需要特别精细的模型可以减少面数并合并成一个模型,阴影可以使用shadowmap,shader的优化也是很重要的,将材质节点转成HLSL更利于优化。减少DrawCall的方法可以从合批入手,合并模型,合并贴图,提高纹理的复用率,合批的模型尽量使用一个材质球。
5.内存
内存占用过高的话,首先是C++里面new了空间,用完要及时的delete,加载了一些资源用完也是需要及时的释放,其次就是避免使用过大的纹理贴图,使用过大的纹理贴图也会影响GPU的消耗,占用过多的显存。
6.半透明物体
半透明物体一般都是最后渲染的,过多的半透明物体对GPU渲染的消耗也是很多的,两个半透明物体重叠时,渲染次序的排序也是比较重要的。
未经允许,禁止转载。
版权归原作者 真的帅! 所有, 如有侵权,请联系我们删除。