1.AB包概念:
Unity提供的一种资源存储压缩包,包含了一些Unity的资源,如图片,模型,纹理,音视频等等,也可以包含用户自定义的二进制文件。一个AB包对应两个文件,其中一个只包含资源内容本身,无后缀是一个二进制压缩文件,另外一个后缀为.manifest是对这个AB包的描述文件,其中描述了AB包中的资源列表以及依赖关系。
2.AB包打包策略:
推荐的分类方式有以下几种:按需求混合搭配
1. 按逻辑进行分类: 即按该资源被哪个功能应用到,同种功能用到的资源打到一个AB包内如将一个UI界面的所有图片纹理,布局文件打包到一个AB包将一个角色的所有动画,模型打包到一个AB包将一些公用的资源打包到一个AB包
2. 按类型分类 将同一个类型下的资源打包到一个AB包中如将Windows和Mac平台下使用到的不同Shader资源分类打包将不同版本的Unity AB包进行分类打包
3. 同时使用的打包 即考虑到哪些AB包可能会在某个时间段一起使用,则打包到同一个AB包中 如某关卡下需要加载的所有资源一起打包 某个场景下需要加载的所有资源,你应该尽可能将所有AB包依赖项都打包进来,避免加载其他依赖项
- 将经常更新和很少更改的资源分开打包
- 将基本会同时使用的资源打包,如模型和它用到的纹理,动画一起打包
- 将一些很多资源会引用到的公共资源分开打包,避免重复打包
- 如果两组几乎不可能同时加载的资源分开打,如Standard和High解析度资源
- 分开打如果一次加载某个AB包经常用到少于50%其中的资源,则应该分开打包
- 考虑合并比较小但经常一起使用的AB包
- 如果某组资源只是同个资源的不同版本分类,使用variant打包(如不同语言版本的同个资源)
3.ab包打包问题
- 资源依赖问题:ab包之间存在依赖关系,比如a包里的prefab引用了b包里的纹理,当b没有被正确加载时会出现问题。 解决办法:
AssetBundleManifest manifest = manifestBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//加载主包
string[] dependencies = manifest.GetAllDependencies("AB包名");
//获取依赖包名字
foreach (string dep in dependencies) { AssetBundle.LoadFromFile("路径/" + dep); }
//加载ab包
2.AB 包加载时出现卡顿:可能因为同步加载导致主线程卡顿,资源太大,可以使用异步加载
IEnumerator LoadABAsync(string path) { AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
yield return request;
AssetBundle bundle = request.assetBundle; }
- 误卸载问题:a包被b,c包引用时,如果a包和b包都被释放了c包的资产就会报错。解决办法:引用计数,每次加载时都会先查看依赖包,存在依赖包就计数加一,每次卸载包时,计数减一当计数为0时才能卸载包体。