Unity性能优化之内存

优化方向

  1. 资源内存占用
  2. 引擎模块自身内存占用
  3. 托管堆内存占用

 

资源内存占用

纹理:主要在于纹理格式和尺寸的选择,在保证游戏效果的前提下进行压缩,可参考 Unity性能优化之编辑器检查——贴图

网格:Mesh资源的数据中经常会含有大量的Color数据、Normal数据和Tangent数据,这些数据的存在将大幅度增加Mesh资源的文件体积和内存占用。其中,Color数据和Normal数据主要为3DMax、Maya等建模软件导出时设置所生成,而Tangent一般为导入引擎时生成。因此需要对导入的FBX进行优化设置,可参考Unity性能优化之编辑器检查——模型。值得注意的是,如果项目对Mesh进行Draw Call Batching操作的话,那么将很有可能进一步增大总体内存的占用。比如,100个Mesh进行拼合,其中99个Mesh均没有Color、Tangent等属性,剩下一个则包含有Color、Normal和Tangent属性,那么Mesh拼合后,CombinedMesh中将为每个Mesh来添加上此三个顶点属性,进而造成很大的内存开销。

 

引擎模块自身内存占用

微小的开销:GameObject、Component、ParticleSystem、MonoScript以及各种各样的模块Manager(SceneManager、CanvasManager、PersistentManager等)

较大的开销:

  • WebStream:WebStream的大小等于AssetBundle原始文件大小 + 解压后的数据大小 + DecompressionBuffer(0.5MB),当项目中存在通过new WWW加载多个AssetBundle文件,且AssetBundle又无法及时释放时,WebStream的内存可能会很大。对于WebStream比较大的AssetBundle文件,建议使用LoadFromCacheOrDownLoad或CreateFromFile来进行替换,即将解压后的AssetBundle数据存储于本地Cache中进行使用。
  • SerializedFile:使用LoadFromCacheOrDownload、CreateFromFile或new WWW本地AssetBundle文件时产生的序列化文件。

 

托管堆内存占用

Unity托管堆内存是由Mono分配和管理的,自动垃圾回收机制可以释放已经不需要的内存。值得注意的是,Mono的堆内存一旦分配,就不会返还给系统,即Mono的堆内存是只升不降的。

  • 字符串连接的处理(stringBuilder代替string)。
  • 尽量不要使用foreach。
  • 使用缓存池。
  • 不要高频率地 New Class/Container/Array等。

 

参考链接:

https://blog.csdn.net/UWA4D/article/details/53643962
https://blog.csdn.net/UWA4D/article/details/53708256

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值