Asset Bundle 格式简析

时间:2024-04-07 15:17:36

Asset Bundle 格式简析


Unity 中,AssetBundle 可以理解成一个档案文件,其中包含了压缩的资源文件。用户在使用 AssetBundle 时,可以流式加载资源,用户可以以数据流的方式陆续地、按需地加载 AssetBundle 中资源的各个部分。可以用 Asset Studio 看下 Bundle 中的具体内容,比如我们打开一个 AB 包,看到一个 ScrollList_Equip_jinse 的资源,该资源下又挂了几个粒子系统。

Asset Bundle 格式简析

简单说明 AssetBundle 是什么之后,下面开始介绍下中的数据具体是什么样的

1. Header 信息

跟其他格式的文件一样,Unity AssetBundle 会先写入头信息,写入标记、版本号、文件大小等信息。Unity AssetBundle 中的头信息如下所示。

Asset Bundle 格式简析

数据 二进制示例
Unity标记,比如这里表示 UnityFS Asset Bundle 格式简析
Archive 的版本号,此处版本号为 6 Asset Bundle 格式简析
Unity Bundle 的版本号 Asset Bundle 格式简析
bundle所需的最小版本号
这里使用的是 Unity2018.4.18f1 的程序进行打包,此bundle有效运行的最小版本号为 Unity2018.4.18f1
Asset Bundle 格式简析
整个AssetBundle文件的大小(header + blocks/directory + data)
此处,注意,使用大端序,比如此处文件的大小是 0x65fb,而不是 0xfb65
Asset Bundle 格式简析
压缩的block数据大小
此处,注意,使用大端序
Asset Bundle 格式简析
未压缩的block数据大小
此处,注意,使用大端序
Asset Bundle 格式简析
压缩选项 ArchiveFlags Asset Bundle 格式简析

2. BlocksInfo

在写完头信息后,开始写入 block(数据块) 信息,block 信息会保存所有数据块的压缩前的大小、压缩后的大小以及Flags。这部分数据,unity 默认使用 Lz4HC 进行压缩,这里解压缩这部分数据,以方便分析。

2.1 BlockInfo

首先会写入一个 Hash 值,以及有多少个 block。
即使只有一个文件,如果文件比较大,也会存成多个 Block,unity在开启流失加载的情况下,每个block的最大值是 128Kb。

数据 二进制示例
Block数据未压缩前的hash Asset Bundle 格式简析
block 数量(大端序编写) Asset Bundle 格式简析

2.2 每个block信息

每个 block 会有10个字节的数据,压缩前后的block大小 8 个字节,flags 有2个字节大小

数据 二进制示例
未压缩的block数据大小(大端序)
示例中表示的大小为 0x01ccd8
Asset Bundle 格式简析
压缩的block数据大小(大端序)
示例中表示 0x6588
Asset Bundle 格式简析
Flags,比如 block 是不是 流式加载 Asset Bundle 格式简析

3. 路径信息

这部分存储的是每个子文件的路径。当然首先存储的是路径数量,本文示例中只有一个文件,数量为1。

数据含义 二进制示例
路径 数量_(大端序)_ Asset Bundle 格式简析

3.1 每个路径节点信息

数据 二进制示例
路径信息数据的位置,第一个文件路径节点,其值一定是 0 (大端序) Asset Bundle 格式简析
该节点未压缩数据的大小_(大端序)_ Asset Bundle 格式简析
节点标志,如是否是一个路径,是否是 serialize文件…(大端序)
如本例中,值为0x04,表示序列化的文件,而本例中确实是 material 文件
Asset Bundle 格式简析
该节点对应的文件路径,比如CAB-3bdc32e90076da9198352f0261e7413c Asset Bundle 格式简析

4. 数据

之后存储的就是一个个文件数据了