Asset Bundle 格式简析

Asset Bundle 格式简析


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

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

1. Header 信息

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

image.png

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

2. BlocksInfo

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

2.1 BlockInfo

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

数据二进制示例
Block数据未压缩前的hashimage.png
block 数量(大端序编写)image.png

2.2 每个block信息

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

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

3. 路径信息

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

数据含义二进制示例
路径 数量_(大端序)_image.png

3.1 每个路径节点信息

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

4. 数据

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值