【Unity游戏开发】AB学习(一)理论基础

AB原理

1. AssetBundles

Unity开发,想要输出产品,热更资源,难免要了解AssetBundle(后面都用ab代替),ab是uniy对资源(例如:模型、预制、音效、甚至整个场景)的一种抽象,unity可以在运行时加载ab文件。你可以自己选择压缩方式(LZMA或LZ4),让ab更小,方便下载,游戏包体也会变小,加载起来也会变快。

ab文件有点像zip文件,像一个大文件夹,把资源都塞进去,这些资源有2种类型:

1. 序列化文件:资产分解成单独的对象并写到该单个文件中。
2. 资源文件:为某些资产(纹理和音频)单独存储的二进制数据块,以允许Unity从另一个线程上的磁盘有效加载它们。

1.1. AssetBundle 结构

总的来说,一个AB包括2个部分:包头数据段

包头:包含有关AssetBundle 的信息,比如标识符、压缩类型和内容清单(manifest:manifest是一个用对象名字做key的查找表),每个条目都提供一个字节索引,该索引指示在AssetBundle的数据段中可以找到给定对象的位置。
在大多数平台,这个查找表是用平衡搜索树实现的。(除了Windows和OSX派生的平台(包括IOS平台)是用红黑树实现)。因此,构建这个清单的时间消耗会随着ab内的资源数量的增加而线性增加。

数据段:通过序列化AB内的资源的原生数据。
- 如果用 LZMA压缩,将压缩 所有序列化资产的完整字节数组;
- 如果是 LZ4压缩,每个资源都是 分开压缩的;
- 如果没有压缩,就都保存原生字节流。

在Unity5.3之前,ab内的资源不能被单独压缩,这就造成了,5.3之前的版本,想要从一个压缩的ab中读取一个或者多个资源的时候,unity要把整个ab解压缩。通常来说,unity缓存了一份ab解压缩的备份,以提高针对同一AssetBundle上后续加载请求的加载性能。

实践

2. 打包AB

实践见下面这篇文章:
Unity5 AssetBundle的一些整理(一)

加载

3. 加载AssetBundle

  • AssetBundle.LoadFromMemory(异步) Unity的建议不要使用此API。
此API消耗的最大内存量将至少是AssetBundle大小的两倍
  • AssetBundle.LoadFromFile
本地加载ab,这个API在速度、磁盘使用和运行时内存使用方面是最有效的。

WWW.LoadFromCacheOrDownload(5.2以下) \ UnityWebRequest(5.3以上)

需要服务器下载的ab

3.1. 从AssetBundles中加载Assets

到这里,我们已经能够获得AssetBundles了,那么接下来就是要从AssetBundles里获取Assets。

Unity提供了三个不同的API从AssetBundles加载UnityEngine.Objects,这些API都绑定到AssetBundle对象上,并且这些API具有同步和异步变体:

其实大多LoadAsset这个接口就能满足了,其他接口,适用范围比较小。

参考:

Manual/AssetBundlesIntro

Assets, Resources and AssetBundles - Unity Learn

Unity手游实战:从0开始SLG——资源管理系统-基础篇(三)AssetBundle原理

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值