优化方向
引擎模块
- DrawCall
- 资源
- UI
- 物理组件
代码模块
- GC
- 代码质量
DrawCall
每一个物体的渲染都需要去调用一次底层接口,而每一次调用前CPU都需要做大量工作,如收集渲染信息等,负担比较大。对于GPU来说,由于是对图形进行并行处理,一次或多次的DrawCall对其工作量影响不大(why are draw calls expensive?)。
- 使用Draw Call Batching,也就是描绘调用批处理。将一些物体进行合并,从而用一个描绘调用来处理它们。
- 把纹理打包成图集。
- 尽量减少反光或阴影之类的效果,其会导致多次渲染。
- Static Batching(静态批处理),将不移动,并且拥有相同材质的物体打勾。
- Dynamic Batching(动态批处理),Unity自动进行的操作,无需手动处理。
资源
Unity性能优化之编辑器检查——贴图
Unity性能优化之编辑器检查——模型
Unity性能优化之编辑器检查——音频
UI
物理组件
- 设置一个合适的fixed timestep。
- 尽量不要使用网格碰撞器。
GC
Unity每执行一次对Mono托管堆的垃圾回收(GC Collect),都很消耗CPU。
- 字符串连接的处理(stringBuilder代替string)。
- 尽量不要使用foreach。
- 不要直接访问gameObject的tag(go.tag == "tag_name"替换成go.tag.CompareTag("tag_name"))。
- 使用缓存池。
代码质量
- Transform等不要多次调用。
- 少用GetComponent。
- 使用内建数组,如Vector3.Zero。
- 使用OnBecameVisible和OnBecameInVisible控制Update(OnBecameVisible() : 这个的意思是当物体在/进入摄像机会调用一次;OnBecameInvisible() : 这个的意思是当物体离开摄像机会调用一次)。
参考链接: