赞
踩
概述:本篇文章从资源加载的方式和具体示例演示,为大家介绍可寻址资源系统的资源加载和资源释放。
同步异步相关概念:
同步:是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去。
异步:是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,当有信息返回的时候会通知进程进行处理。
举个简单的例子帮助理解:你打游戏口渴了想喝水
实战中同步异步的对比
在一般加载中我们通常使用的:Instantiate
来实例化预制。
同步实例化问题:
使用AA系统时 使用InstantiateAsyns
替换Instantiate
:
异步实例化:
Addressables资源加载模式有三个。
如下图,默认情况下是Use Asset Database (fastest):
三种模式使用时机:
AssetReference
的资源引用(Asset)会清空 但AsyncOperationHandle
类的资源引用(Result)不为空在:Windos -> Asset Management --> Addressables --> Event Viewer 打开工具面板:
找到Addressable 的设置面板,开启Send Profiler Events
,即可在Event Viewer面板上看到资源使用情况了:
此工具可以直观的看到,程序运行时的资源引用。
可寻址资源组还是用的前面文章中创建的:此处用到一个Cube,一个Logo,若你没看过之前的问题,新建一下这两个即可到默认分组即可:
使用InstantiateAsync
实例化物体:
搭建测试场景,创建三个按钮分别为:实例化资源,删除实例化,释放资源:
测试代码如下:
using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.UI; public class ReleaseManager : MonoBehaviour { public Button Btn_Load; public Button Btn_Destory; public Button Btn_UnLoad; private GameObject Cube; void Start() { Addressables.InitializeAsync(); Btn_Load.onClick.AddListener(LoadGameObject); Btn_Destory.onClick.AddListener(OnClickDestroyObj); Btn_UnLoad.onClick.AddListener(ReleaseGameObject); } /// <summary> /// 加载物体 /// </summary> void LoadGameObject() { Addressables.InstantiateAsync("Cube").Completed += (hal) => { Cube = hal.Result; }; } /// <summary> /// 释放 /// </summary> void ReleaseGameObject() { Addressables.Release(Cube); } /// <summary> /// 销毁 /// </summary> void OnClickDestroyObj() { Destroy(Cube); // 会自动调用Destroy,销毁物体 //Addressables.ReleaseInstance(Cube); } }
依次点击三个按钮资源引用情况如下:
为了做演示,我这里将资源释放和销毁分开写了,实战中若需要销毁实例化物体可以直接写:
// 释放资源,并销毁物体
Addressables.ReleaseInstance(Cube);
使用LoadAssetAsync
加载图片资源:
创建一个Button用来触发加载,一个RawImage用来接收显示加载的图片,还有一个名Manager空物体用来挂载脚本:
测试示例代码如下:
using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.UI; public class ReleaseTextureManager : MonoBehaviour { public RawImage RawImg_Context; public Button Btn_LoadTexture; void Start() { Addressables.InitializeAsync(); Btn_LoadTexture.onClick.AddListener(LoadTexture); } void LoadTexture() { Addressables.LoadAssetAsync<Texture2D>("Logo").Completed += (hal) => { // 赋值 还原大小 RawImg_Context.texture = hal.Result; RawImg_Context.SetNativeSize(); // 释放资源 Addressables.Release(hal); }; } }
运行看下效果:
AA系统中的资源释放有两个方法一个是Release
,另外一个ReleaseInstance
。两个方法分别用于不同的情况。大致可以记忆为:Release释放不需要实例化资源,ReleaseInstance释放实例化资源。
一个错误使用示范:
使用LoadAssetAsync
加载然后Instantiate
实例化的,是不能通过ReleaseInstance
来进行释放资源的,而通过Release
来释放也只能传递handle
来释放不能传递Cube
这个游戏对象。
Addressables.LoadAssetAsync<GameObject>("Cube").Completed += (hal) =>
{
Cube = Instantiate(hal.Result);
handle = hal;
};
// 这么写释放不掉
//Addressables.ReleaseInstance(Cube);
// 这么写会报错
Addressables.Release(Cube);
// 正确释放方式
Addressables.Release(handle);
Destroy(Cube);
TODO:上一篇 --> Unity 之 Addressable可寻址系统 – 代码加载介绍 – 进阶(一)
TODO:下一篇 --> Unity 之 Addressable可寻址系统 – 资源远程加载 | 资源预下载 – 进阶(三)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。