Unity5-ABSystem(五):AssetBundle内存

无论是否压缩,使用www加载AssetBundle时,内存均有比未压缩之前ab包稍大的上涨,猜测这里www将整个AssetBundle原始文件均载入了内存,从加载耗时来看,如果是LZMA,还进行了3秒多的解压。  接着加载所有资源,非常整齐地所有格式都增长了81.9M。这部分就是我们希望使用的资源。但此时内存占用是我们资源的两倍左右。  测试中遇到比较奇怪的是,无论www.dispose或www = null是
摘要由CSDN通过智能技术生成

AssetBundle内存占用

  先上图,Don’t panic。
AssetBundle内存
  我们从AssetBundle中加载资源一般会经过三个步骤:

  1. www、LoadFromFile、LoadFromMemory等接口加载AssetBundle本身。
  2. 通过AssetBundle.LoadAsset()等接口从AssetBundle中加载资源。
  3. 对于GameObject类资源,还需通过GameObject.Instantiate()创建clone。

  这几个步骤,都会产生内存分配,并且分别对应了图中不同颜色的部分。而图的左边已经写出了产生内存分配的接口,右边则标明了释放内存的方法。
  接下来详细看看每部分的含义。
    

  • 黑色部分:www类本身占用内存,通过www接口加载AssetBundle才会有这部分内存,www对象保留了一份对WebStream数据(粉色部分)的引用。使用www =null 或者 www.dispose()释放。其中www.dispose()会立即释放,而www = null会等待垃圾回收。释放www后WebStream的引用计数会相应减一。

  • 橙色部分:官方称为WebStream数据,是数据真正的存储区域。当AssetBundle被加载进来后,这部分内存就被分配了。它包含3个内容:压缩后的AssetBundle本身、解压后的资源以及一个解压缓冲区(图绿)。无论www(黑色部分)还是后面会提到的AssetBundle对象(粉色部分),都只是有一个结构指向了WebStream数据,从而能对外部提供操作真正资源数据的方法。而当www对象和AssetBundle对象释放时,WebStream数据的引用计数也会相应减1。当WebStream数据引用计数为0时,系统会自动释放。但为了不频繁地开辟和销毁解压Buffer,其中绿色Decompression解压缓冲区Unity会至少保留一份。例如同时加载3个AssetBundle时,系统会生成3个Decompression Buffer,当解压完成后,系统会销毁两个。

  • 粉色部分:AssetBundle对象,引用了橙色WebStream数据部分,并提供了从WebStream数据中加载资源的接口。通过AssetBundle.Unload(bool unloadAllLoadedObjects)释放。如果调用AssetBundle.Unload(false),将释放AssetBundle对象本身,其对WebStream引用也将减少,从而可能引起WebStream释放,我们也就无法再通过接口或依赖关系从该AssetBundle加载资源。但已加载的资源还可以正常使用。如果调用的是AssetBundle.Unload(true),不仅会释放WebStream部分,所有被加载出来的资源将被释放。无论tr

  • 17
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值