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.利用分辨率缩放