前言
偶然在公司学院系统上看到讲解Unity性能优化的课程,感兴趣就学习了一下,正好这个教程是结合我们熟悉的陪伴我们同年的游戏魂斗罗讲起,也是我以前最喜欢玩的一款游戏。
内存优化方面
内存占用主要是以上三个方面,但我们主要优化的是Unity层面。
1.资源优化
贴图
压缩成ETC/PVRTC格式,带有alpha通道的贴图进行alpha拆分,因为android openGL2.0不支持alpha通道,PVRTC上透明通道压缩效果也不太理想。模型
做好LOD,将临近的顶点进行删减,网格精度压缩动画
删除一些冗余的关键帧或者临近的一些关键帧声音
压缩成OGG格式粒子
尽量少用粒子系统,每个粒子占用10K左右内存Shader
预编译的宏,减少从其他处得到的Shader无用代码脚本和配置
及时卸载
2.引擎层占用
AB层占用:
- 规划好公共资源,管理好依赖
- 打包策略
- 自动查找依赖关系
- 凡是公共依赖都打成公共AB
- 合包策略
- 减少IO,同一层级AB进行合包
- 控制合包尺寸,10M以内比较安全,太小了会有过多的IO,太大了会被恶意误删
- 控制同一个AB包中最大资源数量
Mono堆:
- 1.常驻
- 单例Singleton、静态Static
- 细碎、分散
- 影响项目延展性
- 合零为整,从全局进行分析
- 数据采集工具 http://wetest.qq.com/product/cube/
- 分析思路的一些参考 http://www.god.qq.com/article/detail/20966
2.瞬时分配
- 更加细碎、分散
- 一些代码规范 可以通过代码工具来检查控制
- 内存碎片
- GC频率
- 通过Unity-Profiler耐心排查
- 有大量的Best Practice,参考建立代码规范,利用一些代码扫描工具进行监控
- 更加细碎、分散
3.其他
关于内存泄漏:http://gad.qq.com/article/detail/20966
CPU优化方面
大禹治水
峰值控制在33ms以内
波动的、变化的,波峰稍纵即逝
削峰填谷,充分利用CPU
优化颗粒度、降低/均摊密度
微观角度:在每一帧找到问题
宏观角度:从统计数据中发现问题
1.节流
渲染
逻辑
其他引擎的消耗(动画、物理)
UI动静分离,分帧处理,将一些UI更新频率相对较低的分在低帧率update中
不可能做到彻底的分离,否则层级结构会被破坏,UI制作变得抽象且不容易管理
通过减少rebuild次数来控制动态元素的影响
避免SetActive
添加Panel
带来负面影响,DrawCall增多
资源占用
2.开源
- 多线程(多线程计算、多线程加载)
- GPU(将一些工作放在GPU中处理)
性能监控
重视性能监控,及时发现问题