Unity的性能优化主要聚焦在3个方向:内存、CPU、GPU
内存
概述
主要是指资源内存的占用、引擎模块自身内存占用、托管堆占用。
处理手段
- 前置堆内存分配,尽量降低碎片化
- 查验内存泄漏
- 资源预处理
- 字符串拼接、配置表优化、对象池
(1)资源
资源的内存占用往往占据了总体内存的70%以上。资源主要包括:纹理(Texture)、网格(Mesh)、动画片段(Animation Clip)、音频片段(Audio Clip)、材质、着色器、字体、文本资源等。其中Texture、Mesh、AnimationClip、AudioClip最容易造成很大的内存开销。
1)纹理Texture
- 格式
- 尺寸
- Mipmap
2)网格
检查是否需要所有网格数据
(2)引擎自身
占内存比较大的是:WebStream和SerializedFile
(3)托管堆
大多数项目中,托管堆由Mono来进行分配和管理。”托管“是指Mono可以自动调整堆的大小来适应所需的内存,并且可以自动GC。
存在的问题:一旦分配不会返还,所以堆内存只升不降。
一些需要注意的细节:
- 不要在Update、FixedUpdate等高频调用的函数中开辟堆内存
- 不要频繁的Log输出
- 慎重使用UIPanel.LateUpdate
- String连接
CPU
概述
引擎模块性能开销、自身代码开销
处理手段
- Unity资源
- 批处理:静态、动态
- 剔除:遮挡剔除、远近剔除
- AOI
- 图集:合理划分图集、动态图集
- 模型:顶点控制、特效面数控制
- GPU Instancing
- UGUI
- 业务代码
- 执行效率优化
GPU
概述
OverDraw、显存带宽
主要的瓶颈
- 填充率
- 像素的复杂度
- 几何体的复杂度
- GPU的显存带宽
处理手段
- 减少顶点的数量,简化计算的复杂度
- 材质纹理:尽可能少;使用图集;使用Renderer.sharedMaterial代替Renderer.material
- 光照:使用光照纹理,而不是实时灯光
- 距离:使用LOD,离得远的细节可以忽略
- 剔除:遮挡剔除
- Shader:使用mobile版本的shader,更加简单
- 压缩图片,适应显存带宽
- 打包设置的时候,OpenGl中选择ETC1、PVRTC等
- 使用mipmap:存储了原图和一系列缩小的备份图,游戏中选择合适尺寸的小图来渲染;这样图片渲染的质量会比压缩要好,但是消耗了一些内存。