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