参考自《Unity3D脚本编程》-陈嘉栋

DrawCall优化方案:

(1)使用Draw Call Batching,也就是描绘调用批处理。Unity3D再多次运行时可以将一些物体进行合并,从而用一个描绘来渲染他们。

(2)通过把纹理打包成图集尽量减少材质的使用。

(3)尽量少的使用反光、阴影之类的效果,因为那会使物体多次渲染。

批处理分为静态批处理和动态批处理。

动态批处理相对静态批处理有许多约束条件:

(1)批处理动态物体需要在每个顶点进行一定的开销,所以动态批处理仅支持小于900顶点的网格物体。

(2)如果着色器使用顶点位置、法线和UV值三种属性,那么只能批处理300顶点以下的物体;如果着色器需要使用顶点位置、法线、UV0、UV1和切向量,那只能批处理180顶点以下的物体。

(3)不要使用缩放。分别拥有缩放大小(1,1,1)和(2,2,2)的两个物体将不会进行批处理。

(4)统一缩放的物体不会与非统一缩放的进行批处理。

(5)使用缩放尺度(1,1,1)和(1,2,1)的两个物体将不会进行批处理,但是使用缩放尺度(1,2,1)和(1,3,1)的两个物体将可以进行批处理。

(6)使用不同材质的实例化物体(instance)将会导致批处理失败。

(7)拥有lightmap的物体含有额外(隐藏)得材质属性,例如lightmap的偏移和缩放系数等,所以,拥有lightmap的物体将不会进行批处理(除非他们指向lightmap的同一部分)。

(8)多通道的shader会妨碍批处理操作。比如几乎Unity3D中所有的着色器在前向渲染中都支持多个光源,并为他们有效的开辟多个通道。

(9)预设体的实例会自动地使用相同的网格模型和材质。