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会导致拆装箱。
posted @ 2022-02-20 21:32  番茄玛丽  阅读(1115)  评论(0编辑  收藏  举报