[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数量.

 

 四.源码

  MonsterABSystem

posted @ 2017-09-22 12:45  WongSiuming  阅读(9178)  评论(0编辑  收藏  举报