AssetBundle管理与加载

本系列文章由抗痘洁面泥 出品,转载请注明出处。  

Assetbundle管理与加载

最近在做项目优化的时候发现公司的项目用的还是老式的WWW去加载assetbundle资源的形式,而且是通过在两个Update里面分开加载AB和Asset的,这样虽然避免了协程的的使用,但是把一件事分开成了两件事,而且是需要每一帧都要在Update里面去检测,这样会加重Update里面的逻辑负担,所以我自己就重新用协程去写了一套资源加载。

1 对比WWW与LoadFromFile

首先WWW是一种以数据流的形式把AB加载到内存里面,他会在初始化的时候去构造网络连接对象,一种类似socket的东西,而且他会在每次初始化的时候去创建WWW对象,如果不做一个对象池去管理的话会造成对象过多而出发GC,严重的话会导致游戏卡顿,而且Unity官网上也推荐用LoadFromFIle的形式去加载AB,我去测了下,WWW与LoadFromFIle在速度上的差别,LoadFromFIle可以节省约1/3的时间,所以果断舍弃掉WWW。

2 使用协程还是使用Update去加载
使用Update去加载的话相当于是把加载Asset与AB分开来,这样我需要在不同的脚本去处理这两件事,会显得逻辑上很复杂,而且每一帧都要在Update检测,这样让逻辑很难被剥离出来。而用协程去实现的话,协程本身会存在一定的开销,而且协程开启过多也会造成GC,但是资源加载本身就不应该一次性加载过多的资源,所以协程的数量是可以控制的,那么协程的开销也可以忽略不计了,其次是协程把加载Asset与AB结合到了一起,变成了一件事,这样让逻辑更清晰,我只需要去关心这个协程是如何加载AB与Asset就行了,而且也很容易剥离开来。
3 AssetBundle的依赖以及引用计数
我们都知道在打包出来的AB中会有两个文件,一个是AB包,一个是manifest文件,而manifest文件中就记录了这个AB包所有的资源的名字等相关信息,以及AB包所引用的资源,这样的话我们就可以做一个工具用来检测所有AB包中是否存在相同的资源,我们就可以把这些重复的资源单独出来打成一个AB包,而运行时加载依赖的话,需要把 BuildPipeline.BuildAssetBundles设置的输出目录下的AB中的资源加载出来,转换为AssetBundleManifest。而AB的引用是会在加载AB的时候用到,主要是为了我们卸载资源,因为如果我们在加载完AB包之后没有做引用计数的话,如果A依赖了B,C也依赖了B,A与C同时加载到场景中,如果没有做引用计数,卸载A的时候会把B也卸载掉,那么C就会出现资源丢失的情况;此外还会出现内存泄露的情况,所以我们需要去维护一个引用计数,来保证正常的卸载。
4 设计思路
首先我们需要明白我们加载AB包需要写什么东西,需要一个AB名,一个Asset名,一个回调函数,一个引用计数,一个依赖数组,一个AB的加载状态,一个Asset加载状态,如下图所示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值