• [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

  • 相关阅读:
    (MonoGame从入门到放弃2) 初识MonoGame
    C# 13行代码带你模拟登录QQ空间
    (MonoGame从入门到放弃1) MonoGame环境搭建
    Format 、FormatDateTime 与 FormatFloat
    HTML中的em为何物?
    ASP.NET日期格式函数
    解决windows2003不能上传大于200K的问题
    信用卡知识知多少?
    解决:Win7打开控制面板主页就重启
    ASP.NET生成随机密码
  • 原文地址:https://www.cnblogs.com/WongSiuming/p/7574312.html
Copyright © 2020-2023  润新知