AssetBundle(一)——AssetBundle介绍

一:什么是AssetBundle?

Asset(资源) + bundle(捆绑) = AssetBundle(资源打包),一个AssetBundle就是一组资源的集合,简称为AB包。

打包后:它是一个真实存在于硬盘上的文件,可以称为压缩包,里面可能包含多个文件(AB包中的二进制文件,文件名的后缀必须为.bytes)——模型,贴图,材质,预制体,声音,甚至整个场景,在游戏运行时被加载出来

这些文件可以分为两类:Serialized File(序列化文件)和Resource File(源文件)
Serialized File:资源(预制体,模型.....)被打碎放在同一个对象中,最后统一被写进一个单独的文件,最后只有一个文件。
Resource File:某些二进制资源(图片,声音.....)被单独保存,方便快速加载(通常在电脑上可以查看的文件都是源文件,比如声音,图片等)

使用时:它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包里加载出来这个AssetBundle对象,这个对象包含了所有我们当初添加到包里面的内容
二:为什么要使用AssetBundle

1.将可以下载的内容放在AssetBundle里面,在游戏运行时再被加载,可以减少安装包(安卓的的APK)的大小。
2.AssetBundle可以实现资源的热更新。

三:AssetBundle的依赖关系

例如A和B都使用了同一个材质,材质设置的AB包属性为material,贴图设置的AB包属性为texture,那么打包完成后,A和B的包中就不会包含材质资源。

四:解读AB包中的文件

例如打包一个名字叫cube,后缀名是assetbundle的包。打包后发现文件夹下却出现四个文件,那么它们都是什么呢?

——打包成功后,会为当前目录生成一个与目录名同名的二进制文件和一个与目录名同名的manifest文件,与目录名同名的二进制文件(AssetBundles)没有可读性,与目录名同名的manifest文件(AssetBundles.manifest)是一个文本文件可以查看。
——cube.assetbundle的大小为27kb,它是我们打包的资源。
——剩下最后一个是cube.assetbundle.manifest,每打包一个AssetBundle就会生成一个对应的manifest文件,记录了这个文件依赖了哪些包。

当前目录的主manifest文件:(记录的都是AB包中的路径)

CRC:校验码。
Info:记录打包当前包的AB包路径以及自身的依赖关系(例如预制体依赖材质,材质依赖贴图)。


单独AB包的manifest文件:

CRC:校验码。
Assets:记录了当前包中每个资源的真实路径(unity编辑器中的路径)。
Dependencies:记录了当前包中资源的依赖关系(AB包中的路径)。

关于文件校验:
CRC,MD5,SHA1
相同点:它们都是通过对数据进行计算,生成一个校验值,该校验值用来校验数据的完整性。
不同点:
1.算法不同。
CRC采用多项式除法,MD5和SHA1使用的是替换,轮换等方法。
2.校验值的长度不同。
CRC校验值的长度跟多项式有关系,一般为16位或32位。MD5是16个字节(128位),SHA1是20个字节(160位)。
3.校验值的称呼不同。
CRC一般叫做CRC值,MD5和SHA1一般叫做哈希值(Hash)或散列值。
4.安全性不同。
CRC与MD5和SHA1比安全性要弱很多,SHA1的安全性最高。
5.效率不同。
CRC的计算效率最高,MD5和SHA1比较慢。
6.用途不同。
CRC一般用于通信数据的校验,MD5和SHA1用于安全领域,比如文件校验,数字签名等。

五:AssetBundle分组策略

——逻辑实体分组
一个UI界面或者所有UI界面一个包(这个界面里面的贴图和布局信息一个包)
一个角色或者所有角色一个包(这个角色里面的模型和动画一个包)
所有场景所共享的部分一个包(包括贴图和模型)

 

——按照类型分组
所有声音资源一个包,所有shader一个包,所有模型一个包,所有材质一个包.....

 

——按照使用分组
把在某一个时间内使用的所有资源打成一个包
可以按照关卡分,一个关卡所需要的所有资源包括角色,贴图,声音等打成一个包
也可以按照场景分,一个场景所需要的资源打成一个包

 

——把经常更新的资源放在同一个包中,不经常更新的资源与它分离
假如我们有A,B两个资源,每个资源都是100MB,A经常更新,B不经常更新
如果把A和B打成一个包,那么更新了A资源之后还是需要下载整个包,则为200MB
如果将经常更新的A资源与B资源分别打包,则当更新了A资源之后只需要下载更新的A资源包就可以,则为100MB

 

——把需要同时加载的资源放在同一个包里
假如我们有A,B两个资源,它们是需要同时使用的,则把A资源和B资源打成一个包会更方便

 

——把其他包共享的资源放在一个单独的包里面。
假如我们有A,B,C三个资源。A和B是预制体,C是一个材质,A和B共享了C的材质。
如果不把材质单独打包的话,打包时会把A和B依赖的资源同时打进各自的包中,那么包中的资源会出现重复,增加包的大小。
如果把材质单独打包的话,A和B去引用C的材质,这样会避免资源重复打包,减小包的大小


 


——把一些需要同时加载的小资源打包成一个包

 

——如果对于同一个资源有两个版本,可以通过用后缀名来区分(后缀加上v1,v2.....)
————————————————
版权声明:本文为CSDN博主「LLLLL__」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LLLLL__/article/details/88790486

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章