一、规范美术的资源
- 比如对于没有透明通道的图片美术导出时就不需要带透明通道,因为RGB和RGBA压缩的内存大小有一倍的差距
- 降低模型面数,降低模型骨骼数量,降低贴图大小
二、UI的Draw Call优化
- 通过打图集减少DrawCall次数
- Canvas会打断合批
- Text也算一次DrawCall也会打断合批
- Mask也会打断合批,使用RectMask2D可以避免
- 直接修改Image的Color属性会造成Rebulid,可以通过修改材质的Color属性来避免
三、批处理
- 静态批处理:将相同材质的物体合批,静态合批的物体不能自由移动,并且会增加内存占用
- 动态批处理:动态批处理开启后会自动合批,但是对定点数有限制
- GPU Instancing:将多个相同网格和材质的对象进行合批,与静态相比不会造成内存激增,但是是通过传递Transform列表,如果物体没有移动/旋转/缩放只需要一次开销,所以不合适需要频繁修改Transfrom的物体
- 通过代码运行时做批处理
四、UI优化
- 频繁调用SetActive,隐藏一个较大的有很多子节点的UI界面会有很大的开销,可以通过移除屏幕或者修改Layer的方式,频繁对Canvas进行Enable操作会重新执行构建Rebuild以及重新批处理Rebatch
- Image和Text不需要响应时间去掉RaycastTarget可以节省性能
- Mask替换为RectMask2D,Mask会打断合批
- 将UI进行动静分离,不可活动的元素放在一个Canvas下,可获得的放在一个Canvas下,虽然打断了合批,但是减少了网格重建的时间
五、代码上
- 减少GC调用,合理使用值类型和引用类型(等到GC时才会释放),合理使用局部变量(频繁调用的作为全局变量避免不断产生垃圾)和全局变量,每帧调用的函数中限定只有需要分配时才使用某些函数
- 对象池,对于频繁创建和删除的对象利用对象池操作,避免频繁的垃圾回收
- 字符串,移步String和StringBuild的区别
- 装箱会产生GC,Unity创建一个临时的Sytem.Object去包装值类型,临时的引用对象创建和销毁时产生了垃圾
- 协程,注意嵌套协程
- 使用异步加载避免一次性加载大量资源,使用AssetBundle释放不使用的资源