影响性能的因素
CPU
过多的draw call
复杂的脚本或者物理模拟
GPU
1.顶点处理
过多的顶点
过多的逐顶点计算
2.片元处理
过多的片元(既可能是由于分辨率造成的,也可能是由于overdraw造成的)。
过多的逐片元计算
带宽
使用了尺寸很大未压缩的纹理
分辨率过高的帧缓存
优化技术
CPU优化
使用批处理技术减少draw call数目
无论是动态批处理还是静态批处理,都要求模型之间需要共享同一个材质。
1.动态批处理
动态批处理的条件:能够进行动态批处理的网格的顶点属性规模要小于900;
一般来说,所有对象都需要使用同一个缩放尺寸;一个例外情况是,如果所有的物体都使用了不同的非统一缩放,那么它们也是可以被动态批处理的。但在unity5中,这种模型缩放的限制已经不存了;
使用光照纹理(lightmap)的物体需要小心处理。需要保证它们指向光照纹理中的同一个位置;
多Pass的shader会中断批处理。
2.静态批处理
对于静态批处理来说,它的优点是自由度很高,限制很少;但缺点是可能占用更多的内存,而且经过静态批处理后的所有物体都不可以在移动了。
GPU优化
减少需要处理的顶点数目
1.优化几何体
2.使用模型的LOD(Level of Detail)技术
3.使用遮挡剔除(Occlusion Culling)技术
减少需要处理的片元数目
1.控制绘制顺序
2.警惕透明物体
3.减少实时光照和阴影
减少计算计算复杂度
1.使用Shader的LOD(Level of Detail)技术
2.代码方面的优化
a.通常来讲,游戏需要计算的对象,顶点和像素的数目排序是 对象数<顶点数<像素数 。因此,我们应该尽可能地把计算放在每个对象或逐顶点上。
b.尽可能使用低精度的浮点值进行运算。float/highp适用于存储诸如顶点坐标等变量,而half/mediump适用于一些标量,纹理坐标等变量,而fixed/lowp适用于绝大多颜色变量和归一化的方向矢量,在进行一些对精度要求不高的计算时,我们应该尽量使用这种精度的变量。
c.对于绝大多数GPU来说,在使用插值寄存器把数据从顶点着色器传递给下一个阶段时,我们应该使用尽可能少的插值变量。
d.尽可能不要使用全屏的屏幕后处理效果。
e.尽可能不要使用分支语句和循环语句。
f.尽可能避免使用类似sin,tan,pow,log等较为复杂的数学运算。我们可以使用查找表来做为替代。
g.尽可能不要使用discard操作,因为这会影响硬件的某些优化。
h.尽量避免在不同精度之间的转换,这有可能会造成一定的性能下降。
节省内存带宽
1.减少纹理大小
a.所有的纹理的长宽比最好是正方形,而且长宽值最好是2的整数幂
b.使用多级渐远纹理技术(mipmapping)
c.纹理压缩
2.利用分辨率缩放