unity 内存释放分析

本文分析unity,资源加载释放方式

首先材质、贴图在内存中时非常消耗内存的,unity对这些资源采用的是引用计数方式即,两个Asset用同一张贴图时,贴图在内存中并不会有两份,而是共用一份。然后对贴图引用计数进行加一,如果Asset销毁时,把对应的贴图引用进行减一,当引用计数为0时,执行Resources.UnloadUnusedAssets()或者跳转场景时,这些引用计数为0的资源会被释放。

下面讨论下三种模式下,GameObject引用图片加载释放方式。

第一种:直接在unity中创建即在Hierarchy视图中创建,销毁方式Destroy(gameobject)

这种方式GameObject会让引用到贴图加载到内存,并把贴图引用加一

执行Destroy后,会删除掉GameObject但是GameObject引用的贴图,不会被销毁,只会将贴图引用减一,虽然贴图引用为0,但并不会在内存中被释放,因为还没执行。Resources.UnloadUnusedAssets()或者场景跳转。

第二种:Resources,Load加载的方式,释放资源跟第一种一样,Destroy只会销毁物体,贴图资源需要调用Resources.UnloadUnusedAssets()或者场景跳转才释放。

第三种:Assetbundle加载方式,这个较为特殊点,首先调用AssetBundle.LoadAsset() 方法时Assetbundle会在内存创建一份GameObject,贴图引用为1。使用时Instance后会在内存中重新复制一份AssetBunlde中的GameObject,这时贴图的引用会再次加一,即此时贴图的引用计数是2

执行Destroy掉instance出来的GameObject,贴图的引用会减一即1,因为Assetbundle还对其引用着,执行Assetbundle.Unload(false)对其卸载,这时贴图的引用就变成了0,调用Resources.UnloadUnusedAssets()或者场景跳转即会释放。

也就是说Assetbundle内存释放需要我们手动调用Assetbundle.Unload(xxx);这里的xxx,可以是false也可以是true。设置false时即销毁GameObject对贴图引用减一。设置为ture时,资源释放比较强制,即使从AssetBundle中Instance出来的GameObject对贴图引用着,Assetbundle.Unload(true)时也会把贴图强制设置卸载。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一零壹0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值