Unity3D影响性能的因素
CPU
a.过多的draw call
b.复杂的脚本或者物理模拟
GPU
a.顶点处理:
<1>过多的顶点
<2>过多的逐顶点计算
b.片元处理:
<1>过多的片元(既可能是由于分辨率造成的,也可能是由于overdraw(即一个像素被绘制多次)造成的)
<2>过多的逐片元计算
带宽
a.使用了尺寸很大且未压缩的纹理
b.分辨率过高的帧缓存
Unity3D优化技术
CPU优化
a.使用批处理技术减少draw call数目(动态批处理和静态批处理,使用共享材质,打包图集)
GPU优化
a.减少需要处理的顶点数目
<1>优化几何体
<2>使用模型的LOD(Level of Detail)技术
<3>使用遮挡剔除(Occlusion Culling)技术
b.减少需要处理的片元数目
<1>控制绘制顺序
<2>警惕透明物体
<3>减少实时光照(使用烘焙贴图)
c.减少计算复杂度
<1>使用Shader的LOD(Level of Detail)技术
<2>代码方面的优化
(1)对象数<顶点数<像素数,尽可能把计算放在每个对象和逐顶点上
(2)尽可能使用低精度的浮点值进行运算,最好精度的float适用于存储诸如顶点坐标等变量,但计算速度是最慢的,尽量避免在片元着色器中使用这种精度进行计算。half适用于一些标量,纹理坐标等变量,它的计算速度大约是float的俩倍,而fixed适用于绝大多数颜色变量和归一化后的方向矢量,在进行一些对精度要求不高的计算时,尽量使用这种精度的变量。它的计算速度大约是float的4倍,但避免对这些低精度变量进行频繁的swizzle操作(如color.xwxw)。尽量避免在不同进度之间的转换。
(3)尽可能不要使用全屏的屏幕后处理效果。
(4)尽可能不要使用分支语句和循环语句,尽可能避免使用类似sin,tan,pow,log等较为复杂的数学运算。可以使用查找表来作为替代,尽可能不要使用discard操作,因为这会影响硬件的某些优化。
节省内存带宽
a.减少纹理大小(多级渐远纹理(Mipmapping)和纹理压缩,纹理长宽比最好是正方形,而且长宽值最好是2的整数幂)
b.利用分辨率缩放