Addressable Asset System 专为解决大型 Unity 项目的内容管理问题打造,其 Synchronous Addressables API 还能轻松将项目移植到灵活的可寻址系统中。
Addressable Asset System(简称 Addressables)是 Unity 首选的资源管理工具,可以安全、高效地完成资源和内存管理。Addressables 将资源的引用和打包分开处理,可加快运行模式下和运行版本的项目迭代。系统将资源合并为一个个的 Asset Bundles(资源包),一种可在运行时分发、加载资源的 Unity 专有文件结构,然后生成一个内容目录来辅助运行时的内容加载与资源跟踪。
Asset Bundles 可从内存中卸载不需要的内容。Addressables 加载采用了高层级的资产及依赖引用计数方式,可自动卸载不被使用的资源包及相关依赖。此外,系统还自带一个分析工具,可以实时查看资源与资源包的引用次数。
简单来说,Addressable Asset System 能以一定的规则来储存、划分游戏资源,实现快速的搜索、加载。与 Addressables 一道使用的还有 Cloud Content Delivery,一款线上游戏的资源托管和分发方案。本系统可以借助内容分发网络(CDN)将资源直接推送给玩家,不需要额外的代码支持。Addressables 和 CCD 组合使用可缩小游戏体积,在更新之际不必让玩家下载、安装新版本。
Addressable Asset System 可直接在 Package Manager 中安装,支持 Unity 2019 LTS 及以上版本。请参阅 Addressable Asset System 说明文档来快速入门,或者学习这篇“使用可寻址系统节省内存”(点击回看),本文根据 Professinal Service 成员 Patrick DeVarney 的工作经验编写而成。
Addressable Asset System说明文档:
https://docs.unity3d.com/Packages/com.unity.addressables@1.17/manual/index.html
现有异步行为
几乎所有 Addressables 的 API 都为异步行为,由用户控制运行时机,在运算完成时返回结果。这个控制开关就是AsyncOperationHandle。
之所以围绕异步行为来设计系统,是因为当时我们的重心放在了移动端的 CDN 支持上,异步的 API 安全性较高,不论内容在哪都能运行。比方说如果我们想加载一个本地内容,但其依赖却托管在了一个远程位置上,如果异步加载物品可以很好地解决意料之外的内容下载。
但异步行为在其它项目中反而会变成约束。许多 Unity 用户开发的游戏不会有远程下载内容的需要,就算有也会自带精细的下载管理系统。随着用户群体不断成长、多样化,用户对同步行为 API 的需求也逐渐受到我们关注。
同步 API
我们于是新添了 Synchronous Addressables API,在 1.17.4 版的 Addressables 包中可以使用,兼容 Unity 2021.1、Unity 2020 LTS 和 Unity 2019 LTS。
在有了新的 API 后,项目不必调整为异步加载就能用上 Addressables了。同步行为在函数中以 AsyncOperationHandle 的 WaitForCompletion 方法表示,该方法会返回同步运算的结果。
正如前边提到,几乎所有现存的 Addressables API 都为异步行为,这些 API 所返回的也都是 AsyncOperationHandle。通过在类中添加 WaitForCompletion 方法,我们能让所有 API 在运行时都变为同步行为。
比如,我们可以先声明 Addressables.LoadAssetAsync(“MyPrefab”),返回 GameObject 运算的开关 AsyncOperationHandle。这时再声明 WaitForCompletion 会让系统阻拦代码执行,直到资源加载完成。在加载完成后,WaitForCompletion 便会返回代码请求的 GameObject。
异步和同步运算在完成后必须被释放。你可以释放算式本身,或在结果传入处进行释放。
void Start()
//Basic use case of forcing a synchronous load of a GameObject(强制同步加载GameObject的基本用法)
var op = Addressables.LoadAssetAsync("myGameObjectKey");
GameObject go = op.WaitForCompletion();
//Do work...(运行……)
Addressables.Release(op);
潜藏的性能影响
在大部分实例中,同步加载的性能可比肩异步加载,但偶尔也会出现更快或更慢的情况,特定情况下会慢得多。
第一种是 Addressables 运行涉及大量引擎调用时,常出现在一次加载大量资源或体积庞大、依赖繁多的资源时。速度慢的原因是 Unity 2021.1 在以同步方式运行异步引擎接口时会在每次调用短暂停顿一下。这种停顿现象已在 2021.2 中移除,引擎目前处于 alpha 测试。
第二种是当 WaitForCompletion 在后台处理大型运算时,再调用其处理小型运算。WaitForCompletion 运算必须在引擎的任务队列中依次完成,如果小型运算的前头有一些大型运算,则只有前边的完成,系统才能完成队列后方的运算。
大家可以关注和 Addressable 配套的CCD 服务,二者结合可以帮助您快速构建资源更新系统,更多详情可以访问产品页:
https://unity.cn/product/cloud-content-delivery
也欢迎大家加入技术讨论群讨论相关问题,群号:550832645。
长按关注
Unity 官方微信
第一时间了解Unity引擎动向,学习最新开发技巧
每一个“在看”,都是我们前进的动力
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.