Asset Bundle 格式简析
文章目录
Unity 中,AssetBundle 可以理解成一个档案文件,其中包含了压缩的资源文件。用户在使用 AssetBundle 时,可以流式加载资源,用户可以以数据流的方式陆续地、按需地加载 AssetBundle 中资源的各个部分。可以用 Asset Studio 看下 Bundle 中的具体内容,比如我们打开一个 AB 包,看到一个 ScrollList_Equip_jinse 的资源,该资源下又挂了几个粒子系统。
简单说明 AssetBundle 是什么之后,下面开始介绍下中的数据具体是什么样的
1. Header 信息
跟其他格式的文件一样,Unity AssetBundle 会先写入头信息,写入标记、版本号、文件大小等信息。Unity AssetBundle 中的头信息如下所示。
数据 | 二进制示例 |
---|---|
Unity标记,比如这里表示 UnityFS | |
Archive 的版本号,此处版本号为 6 | |
Unity Bundle 的版本号 | |
bundle所需的最小版本号 这里使用的是 Unity2018.4.18f1 的程序进行打包,此bundle有效运行的最小版本号为 Unity2018.4.18f1 |
|
整个AssetBundle文件的大小(header + blocks/directory + data) 此处,注意,使用大端序,比如此处文件的大小是 0x65fb,而不是 0xfb65 |
|
压缩的block数据大小 此处,注意,使用大端序 |
|
未压缩的block数据大小 此处,注意,使用大端序 |
|
压缩选项 ArchiveFlags
|
2. BlocksInfo
在写完头信息后,开始写入 block(数据块) 信息,block 信息会保存所有数据块的压缩前的大小、压缩后的大小以及Flags。这部分数据,unity 默认使用 Lz4HC
进行压缩,这里解压缩这部分数据,以方便分析。
2.1 BlockInfo
首先会写入一个 Hash 值,以及有多少个 block。
即使只有一个文件,如果文件比较大,也会存成多个 Block,unity在开启流失加载的情况下,每个block的最大值是 128Kb。
数据 | 二进制示例 |
---|---|
Block数据未压缩前的hash | |
block 数量(大端序编写) |
2.2 每个block信息
每个 block 会有10个字节的数据,压缩前后的block大小 8 个字节,flags 有2个字节大小
数据 | 二进制示例 |
---|---|
未压缩的block数据大小(大端序) 示例中表示的大小为 0x01ccd8 |
|
压缩的block数据大小(大端序) 示例中表示 0x6588 |
|
Flags,比如 block 是不是 流式加载 |
3. 路径信息
这部分存储的是每个子文件的路径。当然首先存储的是路径数量,本文示例中只有一个文件,数量为1。
数据含义 | 二进制示例 |
---|---|
路径 数量_(大端序)_ |
3.1 每个路径节点信息
数据 | 二进制示例 |
---|---|
路径信息数据的位置,第一个文件路径节点,其值一定是 0 (大端序) | |
该节点未压缩数据的大小_(大端序)_ | |
节点标志,如是否是一个路径,是否是 serialize文件…(大端序) 如本例中,值为0x04,表示序列化的文件,而本例中确实是 material 文件 |
|
该节点对应的文件路径,比如CAB-3bdc32e90076da9198352f0261e7413c
|
4. 数据
之后存储的就是一个个文件数据了