Unity AssetBundle介绍

1.什么是AssetBundle?

AssetBundle是一种资源压缩包。资源打包AssetBundle有两个好处:

  1. 减小安装包的大小,资源可以在进入游戏时候,网络下载。
  2. 热更资源,方便修复线上资源问题引起的Bug,或新增加游戏内容。

AssetBundle分为两种类型:场景AssetBundle & 非场景AssetBundle。

2.AssetBundle结构

2.1 AssetBundle由两部分组成:Header和Data。

  1. 头部包含AssetBundle资源的信息( 版本号,文件信息,数据类型,压缩类型)等,文件信息记录了数据部分里边每个资源的文件名以及每个资源在整个AssetBundle文件中的offset和size,通过这个信息可以直接获取AssetBundle中某个资源的数据。从Unity5.3开始这部分数据会单独生成一个跟AssetBundle同名的.mainfest文件。
  2. 数据段包含打包到AssetBundle中的资源(模型,贴图,Shader,预制体,声音,场景)等。

非场景AssetBundle结构:

Unity AssetBundle介绍_第1张图片

场景AssetBundle结构:(PreloadData,AssetBundle应该是在Shared data中,更多的Objects在SerializedFile中)

 Unity AssetBundle介绍_第2张图片

全局光照数据(Global Illumination Data)

SerializedFile中记录着重建资源所需的信息。

Profiler中SerializedFile的大体组成如下:

  • 14KB File Read Cache
  • (较大)TypeTree,用于兼容老版本打包的AssetBundle在新版本中使用。BuildAssetBundleOptions.DisableWriteTypeTree可关闭兼容,减小内存占用。
  • 一个AssetBundle有外部引用,自动分配一个72KB的内存。
  • (较小,与AB内的Object数量相关)Object map & infos
  • 2017.4.8以后(一个AssetBundle有外部引用,自动分配一个4KB的内存。)

2.2 经过压缩后的AssetBundle:

采用压缩(LZMA,LZ4)的AssetBundle数据段的格式:Unity AssetBundle介绍_第3张图片

图中压缩部分表示可有块压缩(chunk-based)、流压缩(stream-based)两种方式。流压缩(LZMA)在处理整个数据块时使用同一个字典,它提供了最大可能的压缩率但只支持顺序读取。块压缩(LZ4)指的是原始数据被分成大小相同的子块并单独压缩。如果你想要实时解压/随机读取开销小,则应该使用这种。


Unity安装包中有两个工具,可反编译已打包的AssetBundle

1.WebExtrct

Unity AssetBundle介绍_第4张图片

可查看AssetBundle信息,如上图,可查看AssetBundle版本,大小。同时得到一个16进度文本。 

Unity AssetBundle介绍_第5张图片

2.binary2text 进一步处理上一步的16进度文本。

Unity AssetBundle介绍_第6张图片

Unity AssetBundle介绍_第7张图片

size = AssetBundle中某个资源的大小

Unity AssetBundle介绍_第8张图片

1. External References = 有其他AssetBundle引用,列在此处。

2. m_Container = AssetBundle文件中的所有资源。

  • m_FileID = External References中依赖的ID。例如m_FileID = 1,对应External Referencespath(1):xxxxxxxx。xxxx就是被依赖的资源。对应如果m_FileID = 0;说明没有依赖其他AssetBundle。
  • m_PathID = 某个资源在AssetBundle中的唯一Id

3. 加载某个资源,需要依赖的资源在m_PreloadTable中查找

  • preloadIndex = m_PreloadTable中的index。
  • preloadSize = m_PreloadTable中的index开始到+index+preloadSize的资源。

PS:LoadAsset 传入string,去m_Container中,然后Preload中查找依赖的的资源。组成需要的资源,返回需要的资源。

  • AssetId = m_FileID + m_PathID 
  • InstanceId 每次实例化对象,ID高位加2,因此不唯一
  • MonoScript 有一个GUID 关联DLL里边的Class

AssetBundle构建出现差异,但是上边的16进度文本一致。float精度不够造成的。可用-hexfloat对比前后两个版本的Assetbundle。Unity AssetBundle介绍_第9张图片

参考:

https://docs.unity3d.com/Manual/ClassIDReference.html

https://www.cnblogs.com/pinkfloyd/p/6489979.html

https://blog.csdn.net/qq_35361471/article/details/82854560

https://www.youtube.com/watch?v=mMjcDjM8Fm8

https://blog.csdn.net/lodypig/article/details/51863683

你可能感兴趣的:(AssetBundle)