目录
一、总结Unity开发中耗时高的操作
1.资源及UI
2.场景设置
3.代码
二、堆内存
1.累积分析
(1)常见的会引起堆内存累积的Unity API:
(2)常见的会引起堆内存累积的System操作
(3)其他
2.泄露分析
三、CPU
1.瓶颈函数优化
(1)明显造成耗时的函数
(2)稍明显耗时函数
2.高频函数优化
(1)对于多个高频Update
(2)针对低频逻辑,轮循式改为事件队列
(3)针对高频逻辑,将高频访问的属性分离到单独的Array中
3.IL2CPP
一、总结Unity开发中耗时高的操作
1.资源及UI
- 一般来说,纹理尺寸越大,占用的内存也就越大,一般情况我们推荐纹理尺寸为 512*512,如果 512*512 显示效果已经够用,那么就不要用 1024*1024 的纹理,因为后者的内存占用是前者的 4 倍。
- 文本使用 Outline 效果会增加 4 倍的顶点数,造成较高的重建开销,可尝试用 shadow 替代。
- 图片RGB32、RGB24 等非压缩格式的纹理占用内存较大,建议尽可能使用硬件支持的压缩纹理格式。
- 图片Wrapmode 使用了 Repeat 模式,容易导致贴图边缘出现杂色。
- 音频源文件为双声道且没有开启Force To Mono。在Android设备上,双声道音频意义不大,但是会占用双倍内存,建议使用单声道。
- 音频文件Streaming 选项开启后,音频加载方式变为边播放边读取,会明显降低内存占用,一般建议背景音乐使用这种方式。
- Read/Write 选项启用后,将会允许从脚本来访问网格数据,同时会产生网格数据的副本,占用额外内存,等同于一个网格数据会有接近2倍的内存消耗。但是对于需要使用StaticBatchingUtility.Combine进行合批的Mesh,以及部分Unity版本中粒子系统里使用到的Mesh,仍需要开启Mesh的Read/Write选项。
- Mipmap开启后,内存会是未开启 Mipmap 的 1.33 倍,因为 Mipmap 会生成一组长宽依次减少一倍的纹理序列,一直生成到 1*1。 Mipmap 提升 GPU 效率,一般用于 3D 场景或角色,UI 不建议开启。
- Tiled 模式的 Image 组件可能产生过多的面片。
- 不建议使用面片数超过 500 的网格。
- 粒子系统的Prewarm操作会在使用时的第一帧中造成相对集中的CPU耗时,很可能会造成运行时局部卡顿,建议考虑是否确实需要开启该选项,如果可以不用则将其关闭。
- 粒子系统:不建议使用尺寸过大(256)的纹理。
- 粒子系统建议不要开启Collison或Trigger功能,否则会有较高的物理开销。
- ApplyRootMotion勾选后,更新动画时会将Root的运动信息应用到Animator所在的 GameObject上,会有一定的开销。一般对于主玩家这样的物体,要用动画控制人物前进 的情况下需要开启ApplyRootMotion,否则建议在ImportSettings中将动画的"Root Motion"bake到曲线中,并取消勾选ApplyRootMotion。
- alpha=0, 且对应的Canvas Renderer组件没有开启Cull Transparent Mesh 的 Image 组件依然会参与渲染,建议进行排除。
- Canvas下UI节点太多,会导致加载及UI重建耗时。
2.场景设置
- 开启雾的效果,GPU 消耗提高。
- MeshCollider 的开销较高,建议替换为简单碰撞体来简化物理碰撞的开销。
- 接收音频的组件AudioListener正常情况只放一个。
- Unity中开启了阴影的实时光照会对所有设置了cast shadow 的object进行实时阴 影渲染,使用forward rendering对每一个开启阴影的实时光照都会产生大量的渲染消 耗。通常推荐场景中只存在1个开启了shadow的实时光照,如需要多个光照,建议关闭 其他光照的阴影渲染。