自动分组
默认,在 Unity 项目给资产打包的时候,如果一个资产没有主动分配过 AB 的名字,却又被多个 AB 中的资产所引用,那么这个资产必然会冗余到多个引用了其的 AB 中。
资产冗余的后果有哪些呢?自然不会只是包体膨胀这么简单,从打包时间拉长,到内存占用变高,再到 IO 成本加剧,最后产生糟糕的用户体验,用户流失恐怕都是早晚的事。
其实,解决这种被依赖资产打包冗余的问题也非常简单,就是主动给其分配一个 AB 的名字就好,而新版本的 xasset 会根据资产的引用关系,生成分包名字。
例如,a 被 c,b,d 引用,c,b 的包名是 c_b.bundle,d 的包名是 d.bundle,这个时候,a 会被分配到 auto_hash(c_b_d) 的包名中,如果其他公共依赖也和 a 具有一样的引用关系,也会和 a 分配到一起,这样,就会尽可能的把同时加载使用的资产打包到一起,且不论资产放在哪个目录。
需要注意的是,Unity 默认的资产引用问题造成的冗余,构建管线不会告诉你,如果你主动把一个资产分配到多个 AB 中,Unity 会中断打包进程,并提示你不能这样。
—— Unity 这是只许州官放火,不许百姓点灯?
使用方式
如何使用自动分组?如果打包配置中的 Groups 所采集的资产包含带依赖的资产,可以在打包配置中开启 Auto Group With References 的选项。而如果确定打包配置中的资产没有依赖,则可以关闭这个选项,加快打包速度。
内部规则
分组其实就是分配打包粒度,自动分组如何给资产分配打包粒度呢?请参考以下说明:
- 采集打包设置中的资产的时候,对打包配置中包含的配置了需要查找引用的分组进行依赖分析。
- 根据依赖分析把没有分组的资产筛选出来,并记录他们每个资产具体被哪些资产所引用。
- 根据引用关系,为没分组的资产生成一个最适合按需加载且对版本管理相对友好的分组名字。
这里需要注意的是,如果自动分组的资产最终打包后输出的文件体积过大,例如,超过 3 MB,那么最好使用主动分组进行拆分。
对于 3 MB 如何理解呢?一张 ETC-2 格式的 2048 * 2048 的贴图使用 LZ4 压缩打包后输出的的大小大约为 1 MB,3 个 2048 的资产基本可以覆盖一个屏幕了,而打包粒度主要服务于按需加载合批,以及更小的更新成本,其他的可以自行把握了。