Unity内存优化分享

首先我们在做Unity内存优化之前,需要了解一下Unity的内存结构

一般我门项目打包发布之后运行内存占用的构成分别是  MonoHeap+NativeReserverd+第三方插件+音频+平台的基础库+Cavnas+ 编译内存。还有一些根据不同操作系统会有一些其他的内存占用。

内存优化时需要注意几点:

1. MonoHeap+NativeReserverd+第三方插件内存 == Dynamic Memory(也就是UnityHeap使用上限),需要注意的是UnityHeap是会自动扩容,也就是申请内存时如果内存不足引擎会GC一次,GC之后还是不够则会扩容。如果你的内存申请在操作系统的控制策略下超出阈值,非常容易被OOM。并且UnityHeap的内存是不会回退(只增不减),也就是说你的峰值内存也需要非常注意。因为假如当你的UnityHeap内存申请到512,即使你之后把资源都释放掉了,但是UnityHeap内存是不会减小的,会造成内存浪费。

2.使用UnityProfiler查看内存时,第三方插件的内存是没有被监听到的。因为第三方插件是直接调用malloc产生的,这一点需要注意使用真机调试,查看内存。

3.音频可以根据不同平台对音频的支持来选择,尽量使用单轨音频。当然如果是效果优先也可以使用双轨音频等等,但是这一块的内存占用也不可小视。Cavnas内存是有机器的物理分辨率来决定的,所以不同机器上内存占用的不一样的,需多测试。

4.我们进行优化的主要关注点还是在 MonoHeap和Native内存上。

    MonoHeap是由我们的C#代码产生,我们的一些对象,数据。等等,这部分需要避免单帧内分配过多的对象,切记产生跳跃式峰值。

    Native是由Unity引擎产生的,内部对象,包含资源和Unity的逻辑。

    资源占用内存较高的部分一般为纹理。像mesh,Material,animation等一般占用内存较小。一个6万面的模型资源,网格资源一般不会超过10MB,但是一个2048*2048的纹理,内存占用可能达到16MB。所以纹理的优化是由为关键的。

    还有就是有的mesh上会带有Normal,Color,Tangent数据,这些将大幅增加mesh的内存占用,一般是3D建模软件导出时生成的。我们需要注意是否需要这部分数据。

    还有一点非常重要,我们在优化DrawCall 会进行mesh合批,如果有上面这三项数据的mesh和无这些数据的mesh进行合批时,原本无Normal,Color,Tangent会被添加上次三项属性,造成很大的内存开销,需要注意。

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值