Unity 关于图形渲染优化的建议摘录
在Player Settings 中开启Graphics Jobs 可以显著提升图形渲染的表现。
Graphics Job 勾选时,将允许Unity 使用Worker threads 来处理原本在主线程和渲染线程
减少批次(batches)或者令更多的物体共用同样的渲染状态(render state)可以减少SetPass calls。
减少需要被渲染的物体数量可以减少SetPass calls。
减少可见的物体数量
调整摄像机的远裁剪面并使用雾效来弥补远处物体无法被看见的失真现象
使用摄像机(camera)组件的layer cull distance 属性为不同层次的物体设置裁剪距离,如此可以保持场景的真实的前提下减少需要被渲染的物体数量
使用occlusion culling 技术
减少每个物体需要被渲染的次数可以减少SetPass calls 的数量。
实时光照、阴影和反射等效果可能会导致物体被渲染多次,从而影响性能。挑选合适的渲染路径对渲染性能有很大影响。一般情况下,Deffered Rendering 更适合使用大量实时光照、阴影和反射效果的高端设备,Forward Rendering 更加适合低端设备。
渲染实时阴影时,首先需要将会产生阴影的所有物体渲染进shadow map,因此有明显的渲染消耗。
对于静态物体(不会移动的物体)可以使用烘焙技术来预计算光照从而减少实时光照计算。
对于使用实时阴影的项目,使用Shadow Distance、Shadow Cascades 等技术有效优化实时阴影造成的渲染消耗。
反射探针可以创建非常真实的反射效果,但是会造成batches 上的开销,应该尽量减少使用。
合并批次从而减少SetPass calls 的数量。
可以合并为同一个批次(batch)的物体必须满足两个条件:使用同一个材质的同一个实例;拥有完全相同的材质设置(texture、shader、shader 的参数等)。尽量让更多的物体使用相同的材质以更好地利用合批(batching)技术
通过图集技术可以增加合批物体数量:对于那些使用相同材质,仅仅是材质实例使用不同贴图的情况,使用图集技术将不同的贴图打包进一个图集中,这样就可以使用同一个材质实例,达成合批条件。
注意Renderer.material 和Renderer.sharedMaterial 的区别,前者被修改后将会创建一个新的材质实例(无法合批)。
对于Shadow Caster Pass,只要其内部使用的属性相同,即使其在不同的材质中仍然可以和合批。
静态合批(static batching)可能会导致更高的内存和存储消耗:静态合批前,每个参与合批的物体都会创建一个副本,因此不适合密集型显示的物体群(例如茂密森林中的树木)
动态合批会导致一定的cpu 消耗。
目前支持合批的组件有MeshRenderer、Trail Renderers、LineRenderers、Particle System 和Sprite Renderers。
SkinnedMeshRenderer 不支持合批,可以使用SkinnedMeshRenderer.BakeMesh 方法创建一个合适的pose 后改用MeshRenderer 以支持合批技术。
如果目标平台支持,尝试开启Player Settings 中的GPU Skinning,让GPU 接管蒙皮。
由于半透明物体需要严格按照从后往前的顺序渲染,相较于不透明物体而言,他们更难达成合批条件。
提升像素填充率(filling rate)的手段
降低片元着色器的计算复杂度
检查透明材质、粒子系统和UI 元素的重叠情况,防止过量的overdraw
过量的后处理很容易导致像素填充率问题,如果需要用到大量的后处理效果,考虑将这些后处理合并到一个pass 中,例如Unity 提供的PostProcessing Stack
解决内存带宽问题
通过降低纹理内存占用来解决内存带宽问题。
使用纹理压缩技术可以极大减少纹理的大小。
使用Mipmap 技术可以降低远处物体占用内存带宽的问题。