当前位置: 首页 > news >正文

AssetBundle粒度与分配策略剖析

AssetBundle粒度与分配策略剖析

http://gad.qq.com/article/detail/289354

AssetBundle是Unity推荐的资源管理方式,决定如何将项目内的资源分配到 AssetBundle 是不容易的。简单的规则都很有诱惑性,比如将所有对象都放置到他们自己的 AssetBundle 中或者将所有对象都放到一个 AssetBundle 中,但是这些方案都有明显的缺点:

 

AssetBundle 数量太少:

  • 会增加运行时内存使用
  • 会增加加载时间
  • 需要下载大量数据

 

有太多的 AssetBundle:

  • 会增加构建的时间
  • 会加大开发的复杂性
  • 会增加总的下载时间

 

关键之处在于如何将对象分组到 AssetBundle 中。主要的策略有:

  • 逻辑实体
  • 对象类型
  • 内容不相干(Concurrent content)

 

注意一个项目对于不同的内容分类可以将这些并且应该将这些策略混合地使用。比如一个项目可能需要将 UI 元素分组到不同平台的 AssetBundle 中,但是靠关卡或者场景来分组他们项目相关的内容。关于使用的策略,可以遵循下面这些指导:

 

1)相比不经常更新的内容,将经常更新的对象拆分到不同的 AssetBundle 中

 

2)将可能同时加载的对象分组到一起。比如模型和他的动画与纹理

  • 如果一个对象被多个 AssetBundle 中的多个对象依赖,将它分配到单独的 AssetBundle 中

3)如果两个对象不太可能同时加载,比如一个纹理的高清和标清版本,可以将他们分配到不同的 AssetBundle 中

 

4)如果是同一个对象的不同导入设置或者数据的不同版本,考虑使用 AssetBundle 变体(AssetBundle Variants)来替代

 

一旦遵循上面的指导,考虑将任意时刻内小于 50% 能被加载的 AssetBundle 拆分。也可以考虑将一些小的(资产数量小于 5 - 10 个)、会同时加载的 AssetBundle 合并。

 

1、逻辑实体分组

 

逻辑实体分组是一个通过项目功能来分组对象的策略。当采用这种策略时,应用中的不同部分会单独分组进不同的 AssetBundle 中。

 

例如:

  • 一个 UI 屏幕中的所有纹理和布局数据打包在一起
  • 一个角色的纹理、模型和动画打包在一起
  • 被多个关卡共享的场景碎片的纹理和模型打包在一起

 

逻辑实体分组是最常用的 AssetBundle 策略,特别适用于:

  • DLC (Downloadable Content)
  • 实体(Entity)在应用生命周期内多处被用到

 

例如:

  • 通用的角色或者基本 UI 元素
  • 实体(Entity)仅仅是平台或者性能不同而有差异

 

逻辑实体分组的优点是不需要从新下载不变内容的情况下轻松的更新实体。这就是它为什么特别适合 DLC (Downloadable Content)的原因。这个策略也是内存效率最高的,因为应用只需要加载当前使用的实体的 AssetBundle。

 

尽管如此,这也是最难实现的策略,因为分配对象给 AssetBundle 的开发者必须精确地熟悉单个对象是怎样被项目使用的。

 

2、类型分组

 

类型分组是最简单的策略。在这个策略中,相似或者相同类型的对象被放置到同一个 AssetBundle 中。比如,将不同的音轨放置到同一个 AssetBundle 或者不同的语言文件放置到同一个 AssetBundle。

 

这个策略简单的同时,它却经常是在编译时,加载时和升级时最低效的。它常常被用作小文件对象的同时升级,比如本地化文件。

 

3、不相干(concurrent)内容分组

 

不相干内容分组是将需要同时加载和使用内容分组到同一个 AssetBundle 的策略。这种策略最常用在强本地相关属性的内容上,也就是说内容很少或者基本不可能在应用特定的位置或者时间之外出现。举个例子,关卡游戏中每一关卡都独一无二的艺术效果,角色和声效。

 

实现不相干内容分组的最常用的方法是通过场景来构建 AssetBundle,每个 AssetBundle 包括了场景中的几乎所有的依赖。

 

对没有强本地属性的项目,和在应用生命周期内很少出现的内容,应该通过逻辑实体策略来分组。这两种都是最优化使用 AssetBundle 内容的大体策略。

 

一个例子就是,一个角色在世界中随机生成的开发世界游戏。这种情况中,很难预测几个角色会同时出现,所以它们一般需要使用不同的策略。

 

 

 

 

相关文章:

  • Unity Prerfab 环形依赖
  • Unity3D研究院之查找资源被哪里引用了
  • Unity VS 暂挂程序
  • xlua扩展第三方库记录
  • XLua-操作与使用
  • 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)
  • Unity 无缘无故提示缺少类型解决方法
  • Eclipse 最底下有垃圾回收按钮
  • activity堆栈式管理
  • XLUA学习笔记之C#和Lua之间的相互调用
  • Lua 元表(Metatable)
  • XLua Lua访问C#中的方法(四)访问枚举
  • Unity中Shader和AssetBundle结合使用的注意事项
  • 解决打包AssetBundle时Shader(材质)丢失问题
  • hader in AssetBundle
  • Android 控件背景颜色处理
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Druid 在有赞的实践
  • jquery cookie
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • php的插入排序,通过双层for循环
  • Vue学习第二天
  • webgl (原生)基础入门指南【一】
  • 电商搜索引擎的架构设计和性能优化
  • 给github项目添加CI badge
  • 跨域
  • 前端自动化解决方案
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • # Panda3d 碰撞检测系统介绍
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (27)4.8 习题课
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (floyd+补集) poj 3275
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ***通过什么方式***网吧
  • .Net 8.0 新的变化
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net Core 中间件验签
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net Winform开发笔记(一)
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 使用反射注册事件
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • .考试倒计时43天!来提分啦!