AssetBundle系统之(一)打包

系统所做的事情:
1.打包(分析依赖,增量打包)
2.加载(依赖关系加载,多版本支持)
3.卸载(自动卸载无引用资源)


1.先说一下打包规则
为了打包方便,需要定制一套打包规则。
这里的规则:
a.基于文件夹的策略打包
b.打包规则分为 SelfName(资源自身名字为包名)
c.打包规则分为 ForderName(资源所在文件夹为包名)

具体策略:

如图所示:
预制体放在一个文件夹,采用SelfName。
精灵图片放在一个文件夹,采用SelfName。
声音放在一个文件夹,采用FolderName。
(仅仅只是演示,具体策略需要根据项目不同的需求来制定)
(把登陆之前打成一个group,登陆后释放;把每个活动打成一个group等等)

那么上图是什么呢?
就是一个打包编辑器,可以配置需要导出的资源。
本质上就是一个ScriptableObject,通过扩展编辑器开发个UI界面。

定义一个AssetBundleConfig:

创建一个

AssetBundleConfig config= ScriptableObject.CreateInstance<AssetBundleConfig> ();
AssetDatabase.CreateAsset (config, path);

创建后如图所示:


规则定完后,开始打包。
2.打包逻辑
打包逻辑主要分五步:
a.Begin:准备阶段,负责读取上一次保存的缓存文件。

上图为缓存文件,第一行是版本号。
然后是资源路径,资源文件Hash值,资源所在包Hash值,依赖数量,如果有的话,下面还有包的hash值。
Hash的用处:
1.文件Hash:判断这个资源是否需要增量打包,通过读取文件的byte[]数组获取。
2.包Hash:判断这个包是否需要热更,通过打包后的AssetBundleManifest文件获取。

b.LoadAssetTargets:加载所有的资源,构造AssetTarget对象
为什么要加载资源?
分析依赖
为什么5.x还要分析,不是4.x的时候才要分析吗?
1.为了构建自己的name-assetPath数据表,在编辑器下无需打包就能加载资源。
2.分析是否包含冗余资源。
假如说:美术偷偷传了一个材质的文件夹,他不会配到打包配置里面,就有很多prefab是依赖这个资源的。所以很多包都会包含这个资源,就会造成资源的冗余。如果事先分析,发现这种情况,就可以把这个资源,单独导出包,让其他的资源依赖这个包就可以了。
并且只需要设置一个包名,因为5.x已经帮我们做了依赖管理:如果引用的资源是单独的包,那就添加一个依赖项;如果不是,那就把这个资源包含在自己的包内。
那打包的时候设置一下这个材质不就行了吗?
这只是一种容错的方法,有些情况是不可预想的。好的团队按照规则固然重要,但是写工具要从底层处理问题,而不是依赖认为的策略去解决问题。
AssetTarget 对象是啥?

如上图,记录了:
文件信息,对应的资源,以及资源的路径、被设置的包名、当前的资源名,
以及导出规则、hash值、缓存信息、我依赖的资源、以及依赖我的资源。

作用:针对单个资源管理
1.包名与资源路径,在最后Build的时候,需要构建AssetBundleBuild
2.asset为什么要加载进来?通过EditorUtility.CollectDependencies(asset)做依赖查询
(但不是必须的,因为各种组件都会被列出来。可以无需加载asset,直接通过 AssetDatabase.GetDependencies(path),同样会获取到依赖信息,且是Gameobjec级别的。)
3.AssetCacheInfo就是文件Build之后的,缓存信息,下一次增量时会根据此比较。
4.依赖我的集合,用来做冗余剔除,如果数量超过1,就需要单独导出包。
5.ExportRule导出规则,就是之前的SelfName、FolderName,为什么还会No呢?
如果这个资源没有设置过需要导出,且只有一个包依赖次资源,Unity会把这个资源打入到这个包内,而无需导出。

c.Analyze:分析依赖,剔除冗余
1.开始分析,首先要获取上次的Build后的缓存信息。
如果有,并且本次资源的Hash值和之前缓存的Hash值不一样,那就需要重新导出。
如果没有,或者是Hash值一样,那就不需要重新导出。
会设置 isFileChanged 这个字段,最后导出时会判断。
2.通过AssetDatabase.GetDependencies获取依赖信息,把所有的依赖也构建成AssetTarget进行分析。再把这个资源添加到我依赖的资源中,对这个资源添加依赖它的资源,方便后期做冗余剔除。
5.当所有的资源都分析过后。
6.对依赖我的资源进行判断,如果超过2个,就需要单独导出,设置包名。

d.Export:导出
导出的过程,就是Buildpipeline.BuildAssetBundles
通过构建AssetBUndleBuild[]数组来构建。而不是直接设置资源的包名。
好处就是如果是git或者svn项目,设置资源的包名就会导致meta文件变化非常不方便多人协作开发。
坏处就是不能直观的看到。

并且采用ChunkBaseCompression的选项,可以加载时实时解压(速度快,官方推荐)。

e.End:结束,保存信息
导出完成后,通过加载AssetBundleManifest,获取每一个包的Hash值。

再构建依赖关系表,大概的格式就是:(开发模式采用文本格式,发布模式采用二进制)

结构:
assetPath:用于Editor下加载。
bundleName:记录资源对应的包名。
assetName:记录包内资源名
hash:包的hash值
depCount:依赖数量(如果有,会记录对应数量的依赖的包名,方便依赖加载)

最后一步,就是删除无用的AB。也就是上一次打包存在的,本次打包不存在了。
把本次导出的构建成HashSet,读取打包目录下的所有文件,添加到HashSet。如果添加成功了,就代表本次没有,那就需要删除这个包以及对应生成的manifest文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,855评论 0 5
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,289评论 4 31
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,317评论 0 9
  • 上周介绍了Unity项目中的资源配置,今天和大家分享一个AssetBundle打包工具。相信从事Unity开发或多...
    carber阅读 6,400评论 14 20
  • 干法是日本经营之圣稻盛和夫的一本书,与《活法》是姊妹篇,本书通过自己一个个的经历,现身说法。教大家如何看待工作,如...
    无欲有容阅读 718评论 3 3