一、渲染优化技术
几个方面
- CPU方面:使用批处理技术减少draw call数目
- GPU方面:
(1)减少需要处理的顶点数目:
—优化结合体
—使用模型的LOD技术
—使用遮挡剔除技术
(2)减少需要处理的片元数目
—控制绘制顺序
—警惕透明物体
—减少实时光照
(3)减少计算复杂度
—使用Shader的LOD技术
—代码方面的优化 - 节省内存带宽
(1)减少纹理大小
(2)利用分辨率缩放
二、分析工具
P312
三、批处理技术(batching)
实现原理就是为了减少每一帧需要的draw call数目。
优化思想就是每次调用draw call时尽可能地处理多个物体。
利用批处理,CPU会把RAM多个网格合并成一个更大的网格,再发送给GPU,然后在一个Draw Call中渲染他们,
但要注意的是,使用批处理合并的网格将会使用同一种渲染状态,如果网格是不同的渲染状态,那么他们就无法使用批处理技术。
使用同一种材质的物体才可以一起进行批处理,因为这时他们之间仅仅在于顶点数据的差别。我们可以把这些顶点数据合并在一起,再一起发送给GPU,就可以完成一次批处理。
所以我们为了减少Draw Call数目,我们要:
- 避免使用很小的网格,当不可避免使用很小的网格时,那我们就要考虑是否可以合并他们。
- 避免使用过多的材质,尽量在不同的网格中使用同一种材质。
Unity的两种批处理方式:
-
动态批处理P315,优点是 一切都是Unity自己完成的,不需要我们进行任何操作,而且物体是可以移动的,缺点是限制较多(模型的顶点个数属性规模限制、缩放尺度、光照纹理、多个Pass的Shader,等等),一不小心就会破坏这种机制,导致Untiy无法动态批处理一些使用了相同材质的物体。
-
静态批处理P316,优点在于自由度很高,限制较少,缺点就是可能会占用更多的内存(导致VBO顶点缓冲对象数目变大),而且经过静态批处理后的物体就不能移动了,即使在脚本中更改位置信息也是无效的。静态批处理适用于适用于任何规模的几何模型,实现原理就是在运行开始阶段,把需要的静态批处理模型合并到一个新的网格结构中,这意味着这些模型不可以在运行时候被移动。实现方法就是把物体面板上的Static复选框勾选上(只勾选Batching Static也可),
静态批处理内部实现上就是把这些静态物体变换到世界空间下,然后为他们构建一个更大的顶点和索引缓存。对于使用同一个材质的物体,Unity只需要调用一个draw call就可以绘制全部物体,而对于没有使用同一个材质的物体,静态批处理同样也可以提升渲染性能。
增加点光源对静态批处理和动态批处理都会有部分影响,动态批处理的话会导致破坏其限制机制,导致动态批处理失效。而对静态批处理来说其仍然会静态批处理其允许的部分。
例:如果我们使用了1000个相同的树组成森林使用静态批处理,那么内存会增加1000倍,所以我们就要考虑是否需要节省内存,如果更内存重要,那我们就使用动态批处理技术(要注意顶点数限制),或者自己编写批处理的方法。
合并材质、共享材质:共享一个材质对于静态动态来说都是非常重要的,但是不同的模型之间总会需要不同的渲染属性,例如纹理、颜色等等。所以使用一些策略进行合并材质。
- 如果两个材质只有纹理不同,那么我们可以把它们的纹理合并到一张更大的纹理中,这张更大的纹理我们称作图集(atlas),使用时我们就使用不同的采样坐标对纹理采样即可。
- 有时除了纹理,材质上还有区别,颜色、浮点属性等等,材质改变会导致所有使用这个材质的地方都变,所以我们不能改变shader参数。但我们可以使用网格的顶点数据来对其进行存储参数,之前说的VBO(静态批处理后形成很大的顶点缓冲)我们可以对其数据进行相应改变,使之传入顶点着色器,从而产生相应变化。
一些批处理注意、建议事项:
尽可能选择静态批处理,同时关心内存相关情况。
如果无法进行静态批处理,那就使用动态批处理,但要小心限制条件(顶点数目),
对于游戏中使用的金币等,可以使用动态批处理。
对于动画部分物体,我们无法全部使用静态批处理,但其中有不动的部分,可以标识static。
如果相关物体存在在模型空间下的坐标运算,往往会得到错误结果,这是我们可以使用DisableBatching标签强制物体不进行批处理,
使用半透明材质的物体经常会使用严格的从后往前的绘制顺序,这是如果绘制顺序无法满足,那么批处理也会无法应用。
四、减少顶点数
1.优化几何体尽可能减少三角面片数目,建议:移除不需要的硬边和纹理衔接,避免边界平滑和纹理分离。
2.模型的LOD技术,就是允许摄像机原理物体时,细节因为无法注意到,所以这时可以允许减少物体模型上的面片数量,从而提高性能。使用LOD group组件来构建一个LOD,准备多个精细程度的模型,保证摄像机不同距离时,更换不同精细的模型。
3.遮挡剔除技术:剔除看不到的物体,节省我们看不到的东西却计算的开销。使用这个可以减少定点数米和overdraw。
(和视锥体剔除不同,视锥体剔除是剔除摄像机之外的,这个是剔除物体挡住的,不一样)
使用LOD技术和遮挡剔除技术可以同时减少cpu、gpu负荷,提升性能。