CPU方面的性能消耗主要是引擎渲染、物理计算、脚本代码等方面的性能开销。因此针对这几个方面对CPU进行优化。

降低DrawCall

    Unity生成一帧画面的过程:引擎先确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置、法线、UV等),索引(顶点如何组成三角形),变换(物体的位置,旋转,缩放,摄像机位置等),相关光源,纹理,渲染方式(由材质/shader决定)等数据准备好,然后通知GPU开始绘制,GPU基于这些数据,经过一系列的运算,在屏幕上画出成千上万的三角形,最终构成一副图像。
    Unity每次准备数据并通知GPU渲染的过程称为一次DrawCall,该过程是逐个物体进行。

1、Static Batching(静态批处理)
    将静止的物体标记为Static,批处理相同材质或纹理的静态对象,合并材质。但有个缺点是它把批处理中的所有物体组合到一起,相当于创建了一个与这些物体加起来一样大的物体,这样就需要分配相应大小的内存,会导致内存损耗。因此,要平衡各方面的效率。
    原理是化整为零,将多个场景物体预先合成一个大的物体进行绘制,unity会先整合成一个大的vbo(顶点缓冲区对象),而不整合IBO(索引缓冲区对象),一次性提交vbo给GPU,然后并不是把整个vbo都绘制,而是每次需要绘制其中某些物体时改变IBO,选择大vbo上的某一段进行绘制。静态合批可以将多个小物体的绘制合并成一个大物体的绘制,减少对渲染状态的改变,它一次并行绘制多个物体。一个vbo的大小是有限制的,如果物体数量过多,也会被拆分成多个绘制。

2、Dynamic Batching(动态批处理)
    该处理是完全自动进行的,对于顶点数在300以内的可移动物体,只要使用相同材质,就会组成Batch。

Tips

合并图集

    将多个纹理打包成图集来尽量减少材质的使用。合并贴图时应该注意选择同时出现在屏幕的对象贴图进行合并。

光照和阴影

    实时光照和阴影可能增加DrawCall,带有光源计算的shader材质会因为光照产生多个DrawCall。使用灯光会打断DrawCall Batching,尽量使用烘焙灯光贴图来实现灯光效果。

物理组件

脚本代码


注:以上内容来源于网上搜集整理