[Unity]浅谈AssetBundle的依赖关系打包与加载
一.写在前面
通过AssetBundle进行资源管理很方便.对AssetBundle打包时,可以自由决定打包的粒度.将所有单个资源打包成单个bundle自然简单方便,但是却会造成bundle数目过多.本文介绍的是一种依赖关系打包的策略.希望能最大限度的减少bundle数量又不加载冗余资源.
若对AssetBundle没有了解,可以先阅读:Unity动态加载和内存管理(三合一)
二.策略介绍
1.打包的粒度划分的策略
① 所有在指定目录下的文件,即RootList,都被打包成单独结点
② 对于RootList所依赖的所有资源,即DepList,依赖数大于1的,被打包成单独结点,等于1的,向上合并至被依赖结点.
③ 记录打包信息
图例
2.下载策略
① 下载配置文件
② 更新AssetBundle文件
3.加载的策略
程序所有的AssetBundle信息都已经被记录在了文档之中,每次启动游戏的时候,读取配置文档,并将每一个AssetBundle文件的信息存储在一个对应的AssetBundleHint对象中,Hint(即AssetBundleHint,下同)类记录Bundle的加载信息和引用情况.
① 资源所对应的Hint不存在,报告不存在异常,若存在转下
② Hint引用数增加,依赖的Hint引用数增加
③ 若Hint内Bundle为空,加载Bundle,并加载依赖的Hint中未加载的Bundle
④ 若Hint内MainAsset为空,加载MainAsset
⑤ 返回Hint内MainAsset
4.释放策略
① 资源所对应的Hint不存在,报告不存在异常,若存在转下
② 所有依赖的Hint引用数减1,对应的Hint引用数减1
③ 若Hint为引用数为0时, 置空MainAsset,并对Bundle调用Unload(true)
三.注意
1.AssetBundle在加载自身内Asset时,需要保证所以来的资源都在此Bundle内或者在其它被加载上来的AssetBundle中才能保证加载完全正确.
2.打包资源时可以要有过滤,将不打包的的类型或者指定资源滤出.
3.可拓展:记录文件MD5变化(通过git或者svn的改动变化监听即可),进行增量打包.
4.本方式可以最大程度上减少AssetBundle本身的加载资源内存占用,但是会增加AssetBundle数量.
四.源码