Unity:资源优化和内存优化
一、模型
导入模型选项:Import不需要的都不选;网格压缩默认没有,可以根据需要选择压缩层度;不会对网格写入就不勾可读写
Rig页面:勾选optimize game object,骨骼节点合并了。
动画页面,没有动画就不勾。有可以选动画压缩(但要注意压缩关键帧会不会掉帧)
二、纹理
不要导出DDS格式的图片,这个格式Unity无法压缩。
勾选Mipmaps:一种图形渲染技术,如果贴图的基本尺寸是256x256像素的话,它mipmap就会有8个层级。每个层级是上一层级的四分之一的大小,依次层级大小就是:128x128;64x64;32x32;16x16;8x8;4x4;2x2;1x1(一个像素)。
纹理做成POT格式: NPOT且选择Compress时,Unity会在安卓上会以16b进行压缩、在iOS上则truecolor不压缩。所以,需压缩、或mipmap、或tiled的非打包单张纹理需强制POT。
压缩选项选择高质量:
三、UI
DrawCall:任何材质或shader发生改变,就会有一次DrawCall。一个MeshRender对应一个材质,多个MeshRender可以对应同一个Material,多个Material也可以共用一个Shader。
那么理论上,所有的MeshRender共用一个材质一个shader,发送一次DrawCall即可。
DrawCall优化:
- 使用图集Atlas:多个精灵使用同一个材质同一张贴图,那么CPU只需要发送一次DrawCall。保证图集使用率最大化,原则上不超过1024*1024。
- 使用Unity的静态和动态批处理:勾选static bathcing(批处理:通过合并把顶点坐标组建成一个整体),但是有限制:材质相同、mesh在300面以下。
九宫格:比较对称的图形,可以做小一点,用九宫格拉伸,而且不同规格不同大小的面板可以复用同一个资源。
图集:UGUI会自动打包成图集,而NGUI要先打包图集。注意你的图片不能放在Resources文件夹下面,Resources文件夹下的资源将不会被打入图集。
四、场景打包
选择LZ4压缩。
==================================================================================
内存优化
Unity内存分配过程:检查是否有足够的内存单元来存储数据,如果有则分配;如果没有,GC释放内存,释放后有则分配;没有则Unity会扩展堆的大小然后分配。
Unity两个内存管理池:托管堆、堆栈
- 堆栈Stack:存储较小的短暂的数据。
- 托管堆Heap:存储较大的存储时间较长的数据。
GC:将废弃内存重新回收再次使用的过程。Unity会定时对堆内存进行GC操作。
GC分配过程:检查堆内存中每个存储变量 => 检测变量引用是否激活状态 => 没激活则标记可回收 => 标记为可回收的变量被移除。
GC的缺点:执行流程消耗大量时间,导致游戏运行缓慢,帧率低;会使内存碎片化;
解决GC缺点的办法:
- 减少new的次数
- 字符串拼接用StringBuilder而不是string
- new list时规定内存大小
- 射线检测
- 使用静态变量
- 枚举代替常量字符串
- 不要在频繁使用的函数中进行堆内存分配
API优化:
- transform.name GameObject.tag 会产生内存垃圾,使用CompareTag()替代。
- yield return null 代替 yield return 0,返回int会导致拆装箱。