1,AssetBundle的概念与作用
AssetBundle是一个存档文件,是Unity提供的一种用于存储资源的资源压缩包,可以包含模型、贴图、音频、预制体等。
Unity中的AssetBundle系统是对资源管理的一种扩展,通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,可以动态地加载和卸载AB包,继而有选择地加载内容。
而最重要的是AssetBundle可以用于热更新,是Unity更新非代码内容的主要工具。
2,AssetBundle组成
AssetBundle 主要由两部分组成:文件头和数据段
文件头包含了id、压缩类型、索引清单,该索引清单是与 Resources 相同的记录了序列化文件中的字节偏移量的查找表。对于大部分平台该表为平衡搜索树,对 Windows 和 OSX 系列(包括 iOS)则为红黑树,随着 AssetBundle 中对象的增加,构造清单所需时间的增长速度将超过线形增长速度
数据段包含了 Asset 经过序列化的原始数据,数据还可选择是否压缩,若使用 LZMA 压缩,则将所有 Asset 的字节数组整体压缩;若使用 LZ4 压缩,则将每个 Asset 单独压缩;若不压缩,则数据保持原始字节流
3,压缩模式
- AssetBundle 提供了三种压缩格式
- NoCompression:不压缩,解压快,包较大,不建议使用。
- LZMA: 压缩最小,解压慢,用一个资源要解压包下所有资源。
- LZ4: 压缩稍大,解压快,用什么解压什么,内存占用低,一般建议使用这种。
4,AssetBundle的构建
4.1 两种构建方式:
BuildPipeline.BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);
BuildPipeline.BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);
第1种方式打包时要手动收集所有AssetBundleBuild
第2种方式事先生成或手动填写所有需要打包的AssetBundleBuild
推荐第2种方式,可以在Unity编辑器看到所有要打包的AB,比较直观。
4.2 分包策略
- 将需要同时加载的对象分为一组,如一个模型,其所需的材质和动画分为一组
- 若多个 AssetBundle 中的多个对象引用了其他 AssetBundle 中的单个 Asset,则将依赖项分离到单独的包中以减少重复
- 确保两组完全不可能同时加载的对象不在用一包中,如低清和高清材质包
- 若一个包中只有低于一半的对象被频繁加载,可将其拆分
- 将一些同时加载的小包(资源少于5到10个)合并
单个ab包多大合适?
一般控制在10MB以下,最好不要超过20MB,相比总大小,控制单个ab的资源数量尤为重要。如果项目中大部分ab都只包含单个资源,太过分散需要加载的ab过多,导致io压力增加;如果单个ab包含太多资源,首先热更