学习Unity新出资源管理系统-Addressable Asset

1.什么是Addressable(可寻址资产)系统

可寻址资产系统提供了一种通过“地址”加载资产的简便方法。它通过简化内容包的创建和部署来处理资产管理开销。可寻址资产系统使用异步加载来支持从任何位置加载任何依赖项集合。

一旦资产被标记为“可寻址”,就可以从任何地方调用可寻址资产。无论该可寻址资产是驻留在本地播放器还是内容传送网络上,系统都将找到并返回它。您可以通过其地址加载单个可寻址,或使用您定义的自定义组标签加载许多可寻址。

2.为什么要推出Addressable系统

  • 迭代时间:通过其地址引用内容是超级高效的。使用地址引用,只会检索内容。对内容的优化不再需要更改代码。

  • 依赖关系管理:系统不仅返回地址的内容,还返回该内容的所有依赖关系。系统会在整个资产准备就绪时通知您,因此在返回内容之前会加载所有网格,着色器,动画等。

  • 内存管理:该地址不仅可以加载资产,还可以卸载它们。引用会自动计算,强大的分析器可帮助您发现潜在的内存问题。

  • 内容打包:由于系统映射并理解复杂的依赖关系链,因此即使在移动或重命名资产时,它也可以有效地打包捆绑包。可以为本地和远程部署轻松准备资产,以支持可下载内容(DLC)和减少应用程序大小。

3.Addressable系统对比AssetBundle有什么区别

我初步学习了可寻址系统后,也算是对它有了一个了解。

Addressable Assets System 是由 AddressablesResourceManager组成的系统!
  • Addressables和ResourceManager位于不同的包中

  • Addressables 依赖于 ResourceManager

  • 在PackageManager中引入Addressables时,ResourceManager会自动包含

  • 全部用C#编写

ResourceManager是一个用于正确管理资源加载和卸载的框架
  • 使用引用计数执行卸载管理

  • DI可以定制加载过程等

  • 它具有方便的功能,例如显示资源加载情况的分析器

可寻址资源系统与AssetBundle的区别

1.可寻址资源系统只需要一个资源的地址就可以从任意地方进行加载,而AssetBundle需要从制定bundle中加载资源。

2.可寻址资源系统加载到内存中的bundle有引用计数,而AssetBundle加载到内存中的bundle需要自己进行管理。

3.可寻址资源系统会自己管理依赖关系,而AssetBundle需要自己管理依赖关系,维护起来比较困难。

4.可寻址资源系统默认的所有加载操作都是异步操作,可以添加事件监听,而AssetBundle则有同步和异步加载。

4.Addressable系统怎么使用

1.Addressable Assets 窗口

第一次打开" Window -> Asset Management -> Addressable Assets "会需要新建一个Addressable 设置,默认资源分为两组Build In Data,Default Local Group。前者不能改动,而后者我们可以在组里进行添加和删除。我们也可以通过在Addressable Assets窗口右键再选中Create New Group-> Packed Assets来新建组。

1564144976455.png

2.标记资源

通过勾选预设/声音等资源为可寻址资源。

1564145221216.png

然后在Addressable Assets面板上就会有它选中后的状态。


1564145286124.png
1564147005233.png

目前好像还没有把一个可寻址资源文件夹下面的所有资源都自动标记为可寻址资源,还是需要手动,如果有大佬知道的话可以拿出来看下!

3.加载资源

在我们添加好可寻址资源后,就可以在代码中通过可寻址资源的地址来加载资源了。可寻址资源有3个模式可选择

1564147732419.png

Fast Mode: 快速模式:直接加载文件而不打包,快速但Profiler获取的信息较少;在此模式下,我们使用 AssetDatabase.LoadAssetAtPath 直接加载文件。虽然AssetBundle构建可以不要求立即执行的,它不能在探查证实,如果他们被列入其中AssetBundle资产。 Virtual Mode:虚拟模式:在不打包的情况下模拟靠近AssetBundle的操作;与FastMode不同,您可以查看哪个AssetBundle包含资产。此模式最终还加载了AssetDatabase.LoadAssetAtPath 。虽然AssetBundle构建是没有必要的,第一为了构建AssetBundle和资产之间的对应关系。还可以通过设置虚拟通信速度来模拟加载时间。Packed Mode:打包模式:实际上是从AssetBundle打包和加载;在这种模式下,实际构建并加载AssetBundle。

通过key加载

void Start()
{
hand = Addressables.LoadAssetAsync<GameObject>("Cube");
hand.Completed += OnResLoadedHandler;
}

private void OnResLoadedHandler(AsyncOperationHandle<GameObject> obj)
{
GameObject go = obj.Result;
Instantiate(go);
}</pre>

我们可以直接通过 Addressables类的LoadAssetAsync接口来加载资源,参数为可寻址资源的地址。通过监听事件,在加载完成后完成实例化。

Addressables.InstantiateAsync("Cube");

我们也可以直接通过Addressables类的InstantiateAsync接口来直接实例化资源。

通过AssetReference加载

AssetReference类提供了一个机制来访问的资产,而不需要知道的字符串(或其他方式)的地址。

要使用*AssetReference 类访问可寻址资产:

我们在继承自monobehaviour的脚步中添加一个成员:

public AssetReference ar;

然后在该脚本组件的视图中就可以选择可寻址资产了。

1564148138753.png

这样我们就无需知道该可寻址资源的地址也可以直接加载它。

我们也可以通过继承AssetReference直接通过组件来加载资源。详细方法可参考官方案例:

https://github.com/Unity-Technologies/Addressables-Sample/tree/master/Basic/ComponentReference

4.可寻址资产系统的加载

游戏对象实例化要加载,使用Addressables.InstantiateAsync。这将实例化传入指定的预制件location。Addressables将加载Prefab及其依赖项,在该加载期间递增所有项的引用计数。InstantiateAsync在同一地址上调用三次将导致所有依赖资产的ref-count为3。LoadAssetAsync调用三次则不同,每次InstantiateAsync呼叫都会AsyncOperationHandle指向一个独特的操作。这是因为每个结果InstantiateAsync都是一个唯一的实例。InstantiateAsync和其他加载调用之间的另一个区别是可选参数trackHandle。如果将其设置为false,则必须保留AsyncOperationHandle在发布实例期间使用它。这样更有效,但需要游戏开发人员付出更多努力。

游戏对象实例化要卸载,使用Addressables.ReleaseInstance或关闭实例化对象所在的场景。此场景可能已加载(因此已关闭)AdditiveSingle模式。此场景也可以通过Addressables或SceneManagement加载。如上所述,如果设置trackHandle为false,则只能Addressables.ReleaseInstance使用句柄调用,而不能使用实际的GameObject 调用。

关于以下内容的注释Addressables.ReleaseInstance:如果您调用Addressables.ReleaseInstance的是未通过可寻址创建的实例,或者使用trackHandle = false创建的实例,我们会检测Addressables.ReleaseInstance到该实例并返回false以指示它无法释放传递给它的实例。

Addressables.InstantiateAsync有一些与之相关的开销,所以如果你需要每帧100次实例化相同的对象,你应该考虑通过Addressables加载,然后实例化外部的Addressables。在这种情况下,您可以调用Addressables.LoadAssetAsync,然后保存结果,并调用GameObject.Instantiate()该结果。这使您可以灵活地以同步方式调用Instantiate。缺点是我们不知道你创建了多少个实例。如果你打电话时还有漂浮的实例Addressables.Release,你可能会陷入糟糕的境地。例如,引用纹理的预制件将不再具有要引用的有效(加载)纹理,从而导致渲染问题(或更糟)。由于我们可能无法立即触发内存卸载(请参阅下面的“清除内存时”),因此很难跟踪这些类型的问题。

5.可寻址资产系统的Profiler

Window -> Asset Management -> Resource Profiler 打开。

此窗口的目的是向您显示所有Addressables System操作的引用计数的状态。这些操作包括资产包加载,资产加载等。

  • 白色垂直线表示发生加载请求的帧。

  • 蓝色背景表示当前加载了有问题的资产。

  • 图表的绿色部分表示当前的重新计数。

以上就是我对可寻址资产系统的初步了解了。

我对addressable和ab做了更详细的对比,有兴趣的可以打开下面的文章

Addressable Asset System(进阶版AB)和AssetBundle(以下简称AB)制作的资源管理系统的对比 https://www.jianshu.com/p/8009c16fcab3

参考了以下文章:https://blog.csdn.net/u010019717/article/details/81146982

https://docs.unity3d.com/Packages/com.unity.addressables@1.1/manual/index.html

Unity官方可寻址资产系统案例:https://github.com/Unity-Technologies/Addressables-Sample

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容