Assetbundle分包策略总结
https://blog.csdn.net/qq_14914623/article/details/89394354
决定如何将项目内的资产分配到 AssetBundle 是不容易的。光使用简单的规则,比如将所有对象都放置到他们自己的 AssetBundle 中或者将所有对象都放到一个 AssetBundle 中,但是这些方案都有明显的缺点:
AssetBundle 数量太少
会增加运行时内存使用
会增加加载时间
需要下载更多数据
有太多的 AssetBundle
会增加编译的时间
会加大开发的复杂性
会增加总的下载时间
关键之处的如何将对象分组到 AssetBundle 中。主要的策略有:
逻辑实体
对象类型
并行的内容
注意一个项目对于不同的内容分类可以将这些并且应该将这些策略混合地使用。比如一个项目可能需要将 UI 元素分组到不同平台的 AssetBundle 中,但是靠关卡或者场景来分组他们项目关联的内容。关于使用的策略,有一些好的指导去遵循:
相比不经常更新的内容,将经常更新的对象拆分到不同的 AssetBundle 中
将可能同时加载的对象分组到一起。比如模型和他的动画与纹理
如果一个对象被多个 AssetBundle 中的多个对象依赖,将它分配到单独的 AssetBundle 中
如果两个对象不太可能同时加载,比如一个纹理的高清和标清版本,可以将他们分配到不同的 AssetBundle 中
如果是同一个对象的不同导入设置或者数据的不同版本,考虑使用 AssetBundle 变体来替代
一旦遵循上面的指导,考虑将规定时间内小于 50% 能被加载的 AssetBundle 拆分。也可以考虑将一些小的 AssetBundle (资产数量小于 5 - 10 个) 合并。
逻辑实体分组
逻辑实体分组是一个通过项目功能来分组对象的策略。当采用这种策略时,应用不同部分会单独分组进不同的 AssetBundle 中。
例如:
一个 UI 屏幕中的所有纹理和布局数据打包在一起
一个角色的纹理、模型和动画打包在一起
被多个关卡共享的场景碎片的纹理和模型打包在一起
逻辑实体分组是最常用的 AssetBundle 策略,特别适用于:
DLC (Downloadable Content)
实体在应用生命周期内多处被用到
例如:
通用的角色或者基本 UI 元素
完全不依赖于平台或者性能设置的实体
逻辑实体分组的优点是不需要从新下载不变内容的情况下轻松的更新实体。这就是它为什么特别适合 DLC (Downloadable Content)的原因。这个策略也是内存效率最高的,因为应用只需要加载当前使用的实体的 AssetBundle。
尽管如此,这也是最难实现的策略,因为分配对象给 AssetBundle 的开发者必须精确地熟悉单个对象是怎么样和如何被项目使用的。
类型分组
类型分组是最简单的策略。在这个策略中,相似或者相同类型的对象被放置到同一个 AssetBundle 中。比如,将不同的音轨放置到同一个 AssetBundle 或者不同的语言文件放置到同一个 AssetBundle。
这个策略简单的同时,它却经常是在编译时,加载时和升级时最低效的。它最常用的对象需要同时升级的小文件,比如本地化文件。
并行内容分组
并行内容分组是将需要同时加载和使用内容分组到同一个 AssetBundle 的策略。这种策略最常用在具有较强本地属性的内容上,也就是说内容很少或者基本不可能在应用特定的位置或者时间外出现。举个例子,关卡游戏中没一关卡都独一无二的艺术呈现,角色和声效。
实现并行内容分组的最常用的方法是通过场景来构建 AssetBundle,每个 AssetBundle 包括了场景中的几乎所有的依赖。
对没有较强本地属性的项目,和在应用声明周期内很少出现的内容,应该通过逻辑实体策略来分组。这两种都是最大化使用 AssetBundle 内容的大体策略。
这个场景的一个例子就是,一个角色在世界中随机生成的开发世界游戏。这种情况中,很难预测交个角色会同时出现,所以他们一般需要使用不同的策略。
————————————————
版权声明:本文为CSDN博主「钢与铁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_14914623/article/details/89394354