Unity内存优化

lz工作以来,不论是大项目还是小项目也经历过些个后期内存优化,对于内存优化并不是一触而就的事,lz一边工作一边总结。对于优化来说,有些是在项目开发前就可以确定的有些是要在开发中摸索的,只是尽最大能力去做了。把日常经验积累的加上网上学习到的整理起来,然后把这些记录下来,希望对遇到同样问题的童鞋用所帮助。
优化的主要对象是:模型、贴图、代码习惯、框架设计(资源的加载与卸载,ab的划分规划)等。
一、模型优化
“Unity中优化”一直是一个需要从很多细节上把握好的工作,而“模型优化”在此是占主导地位的。在这里主要介绍一下模型方面的优化。
  • 能合并的尽量合并(这个要把握好一个度) 。但不能合并后模型体积过大(这样不能遮挡剔除了),一般房子大小就差不多了。
  • 相同材质贴图(最好mesh也相同)的合并会大大减小Draw Calls。但会增加物体非常多的面数和顶点数。这样增大了CPU的运算,但减小了显卡的渲染。如果模型距离太远的话合并后又会影响遮挡剔除。建议:靠在一起或比较近的材质贴图相同物体合并,较远的就不合并了。
  • 尽量让模型合并材质和贴图,减少贴图和材质数量也有助于减少消耗。
  • 大场景可以将模型分组,在看不到的区域就隐藏这些组的模型。
  • 注意:模型阴影是个非常消耗性能的东西。所以有些物体不需要使用阴影时完全可以将阴影去掉(比如人不使用阴影将减少很大的消耗)。
二、代码优化:
1、用for代替foreach
原因:Mono下的foreach频繁调用容易触及堆上限,导致GC过早触发,出现卡顿现象。尤其在update中,用for代替foreach。
2、string
连接两个字符串的操作使用StringBuilder.Append来代替string。
用法:
String str="abc";
 str+="def";
 StringBuilder text=new StringBuilder("abc",10);
 text.Append("def");

原因:每次使用string的时候,都会在内存里创建一个新的字符串对象,需要为该对象分配新的空间。
3、gameObject.tag = xxx
使用gameObject.CompareTag("XXX")来代替gameObject.tag = xxx。
原因:gameObject.tag会在内部循环调用对象分配的标签属性以及拷贝额外的内存。
4、使用ObjectPool对象池来管理对象,避免频繁使用的Instance,Destroy。
三、贴图优化:
贴图优化的效果更明显。
1、压缩png、jpg图片 https://tinypng.com/。
2、巧妙通过调整纹理资源,来调整图的大小。如:ugui九宫格,部分缩小后在unity中拉大。
3、IOS平台使用PVRT压缩,Android使用ETC1压缩(ETC1只能支持非Alpha通道的图)。
4、mipMap摄像机距离远近替换不同图片。
5、减少色彩使用(纯色)。
四、框架优化
1、场景切换时加一个loading
当前旧场景内存未释放的时候,加载新的场景,此时前后两个场景的内存叠加,很容易达到内存峰值,导致崩溃。如果在中间加一个loading场景,由于loading场景较小,能够避开内存的大量叠加,当旧场景的内存释放完,新场景的初始化结束之后,再隐藏掉loading场景。
因此loading的两个作用是:
(1)避免场景切换时大量内存叠加导致崩溃。
(2)避免后一个场景太大加载过慢卡住的尴尬。
2、把GUI模块加入生命周期管理
主角、强化、技能、商城、进化、背包、任务等系统如果全部打开,内存很容易达到峰值;
需要有效地管理系统模块生命周期:
(1)将模块进行划分:Cache_10(经常打开的)、Cache_5(偶尔打开的)、Cache_0(只打开一次的)
(2)创建一个MuduleMananger类,内部的render方法每分钟轮询一次,
         如果是Cache_0,一关闭就直接destroy释放内存;
         如果是Cache_10,10分钟后自动释放内存;
         如果是Cache_5,5分钟后自动释放内存;
         每次打开模块,该模块都重新计时。
代码占用的内存少,资源占用的内存多。
1.资源类型
GameObject,Transform,Mesh,Texture,Material,Shader,noxss和各种其他Assets
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GarFe-Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值