Unity 之 Addressable可寻址系统 -- 资源加载和释放 -- 进阶(二)

这篇具有很好参考价值的文章主要介绍了Unity 之 Addressable可寻址系统 -- 资源加载和释放 -- 进阶(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述:本篇文章从资源加载的方式和具体示例演示,为大家介绍可寻址资源系统的资源加载和资源释放。

一,资源加载

1.1 同步异步对比

同步异步相关概念:

同步:是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去。

异步:是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,当有信息返回的时候会通知进程进行处理。

举个简单的例子帮助理解:你打游戏口渴了想喝水

  • 同步实现:暂停游戏 下楼买 ——> 找附近超市 ——> 付款 喝水 ——> 回来继续游戏
  • 异步实现:游戏间隙 网上买 ——> 继续游戏 ——> 货到 喝水 ——> 继续游戏

实战中同步异步的对比

在一般加载中我们通常使用的:Instantiate 来实例化预制。

同步实例化问题:

  • 会等到实例化结束才继续运行
  • 大量加载容易造成卡顿。

使用AA系统时 使用InstantiateAsyns替换Instantiate :

异步实例化:

  • 系统不会等待
  • 调用完成时回来继续执行
  • 大量实例化不会卡住系统。

1.2 三种加载模式

Addressables资源加载模式有三个。

如下图,默认情况下是Use Asset Database (fastest):

addressables.releaseinstance,《Unity 之 Addressable》,unity,游戏引擎

  • Use Asset Database (fastest): 快速,直接加载文件而不打包。一般在开发时使用此模式。
  • Simulate Groups (advanced): 在不打包的情况下模拟AssetBundle的操作。
  • Use Exising Build: 实际上是从AssetBundle打包和加载。需要先通过Build打包,才能使用,也可以加载本地和远程Bundle。

三种模式使用时机:

  • Fast Mode --> 研发阶段
  • Virtual Mode --> 本地模拟
  • Packed Play Mode --> 正式打包

二,释放资源

2.1 基础概念

  1. 资源释放 不影响场景中实例化出的对象,但是会影响非实例化的资源(材质、音效等)。
  2. 释放后的资源,再次使用需要重新加载。
  3. 资源释放后AssetReference的资源引用(Asset)会清空 但AsyncOperationHandle类的资源引用(Result)不为空

2.2 实例演示

在:Windos -> Asset Management --> Addressables --> Event Viewer 打开工具面板:
addressables.releaseinstance,《Unity 之 Addressable》,unity,游戏引擎
找到Addressable 的设置面板,开启Send Profiler Events ,即可在Event Viewer面板上看到资源使用情况了:
addressables.releaseinstance,《Unity 之 Addressable》,unity,游戏引擎

此工具可以直观的看到,程序运行时的资源引用。

可寻址资源组还是用的前面文章中创建的:此处用到一个Cube,一个Logo,若你没看过之前的问题,新建一下这两个即可到默认分组即可:
addressables.releaseinstance,《Unity 之 Addressable》,unity,游戏引擎

2.2.1 示例演示一

使用InstantiateAsync实例化物体:

搭建测试场景,创建三个按钮分别为:实例化资源,删除实例化,释放资源:

addressables.releaseinstance,《Unity 之 Addressable》,unity,游戏引擎

测试代码如下:

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,《Unity 之 Addressable》,unity,游戏引擎
为了做演示,我这里将资源释放和销毁分开写了,实战中若需要销毁实例化物体可以直接写:

// 释放资源,并销毁物体
Addressables.ReleaseInstance(Cube);

2.2.2 示例演示二

使用LoadAssetAsync加载图片资源:

创建一个Button用来触发加载,一个RawImage用来接收显示加载的图片,还有一个名Manager空物体用来挂载脚本:

addressables.releaseinstance,《Unity 之 Addressable》,unity,游戏引擎

测试示例代码如下:

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);
        };
    }
}

运行看下效果:

addressables.releaseinstance,《Unity 之 Addressable》,unity,游戏引擎


2.3 注意事项

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可寻址系统 – 资源远程加载 | 资源预下载 – 进阶(三)文章来源地址https://www.toymoban.com/news/detail-782114.html

到了这里,关于Unity 之 Addressable可寻址系统 -- 资源加载和释放 -- 进阶(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity资源管理(AssetBundle加载和卸载)及内存管理(内存的申请和释放)

    GameObject, Transform, Mesh, Texture, Material, Shader, Script和各种其他Assets。 静态引用,在脚本中加一个public GameObject变量,在Inspector面板中拖一个prefab到该变量上,然后在需要引用的地方Instantiate; Resource.Load,资源需要放在Assets/Resources目录下; AssetBundle.Load, Load之后Instantiate。 GameOb

    2024年02月16日
    浏览(28)
  • Unity 如何基于addressable来做资源管理

    一、什么是Addressable系统 Addressable系统是Unity 2018.3版本中推出的一种资源管理方案,它可以帮助我们更好地管理游戏中的资源。在以往的游戏开发中,我们通常使用Resources来进行资源加载,但是这种方式存在很多问题,比如加载速度慢、内存占用高等。Addressable系统可以解决这

    2024年02月16日
    浏览(24)
  • unity学习(垃圾回收,资源释放)

    在C++中,所有你在堆上申请的内存空间,必须手动释放掉,否则就会造成内存的泄露。 C#使用了GC(Garbage Collector)来进行内存的管理以达到自动释放不需要的内存的目的,但是GC并不能做的十分完美,对于一些非托管资源,GC无能为力,这就要求我们必须手动的释放那么非托

    2024年02月16日
    浏览(24)
  • Unity编辑器从PC平台切换到Android平台下 Addressable 加载模型出现粉红色,类似于材质丢失的问题

    Unity编辑器在PC平台下使用Addressable加载打包好的Cube,运行发现能正常显示。 而在切换到Android平台下,使用Addressable时加载AB包,生成Cube对象时,Cube模型呈现粉红色,出现类似材质丢失的问题。如下图所示。 这是因为GraphicAPI不同导致的。编辑器默认用的是PC平台的GraphicAPI。

    2024年02月08日
    浏览(35)
  • Unity3d:GameFramework解析:实体,对象池,资源管理,获取计数,引用计数,自动释放

    1.GF万物基于引用池IReference 2.ObjectBase : IReference类的m_Target持有unity中Mono,资源,GameObejct 3.AssetObject : ObjectBase类m_Target持有Assetbundle中的Asset,具有获取,引用两个计数管理释放 4.ResourceObject : ObjectBase类m_Target持有Assetbundle,具有获取,引用两个计数管理释放 5.EntityInstanceObject :

    2024年02月11日
    浏览(22)
  • Addressable 异步加载场景并获取加载进度

    一开始用PercentComplete函数获取加载进度,发现每次都是从0.85开始计算,不准,官方文档解释:“ PercentComplete 将反映总体操作的进展情况,而不会准确地表示仅下载百分比或加载到内存中的百分比。 ” ,“ 要获得准确的下载百分比,请使用GetDownloadStatus()。” GetDownloadStatu

    2024年02月12日
    浏览(28)
  • 天翼云存储资源盘活系统HBlock,全面释放企业数据价值

    9月6日,天翼云与科技媒体InfoQ联合举办的以“存储难题新解法,揭秘极/致易用的HBlock”为主题的线上技术分享会圆满落幕。天翼云国际业务事业部研发专家武志民与存储产品线总监魏玮以“天翼云存储资源盘活系统 HBlock,深挖独创技术亮点与实战演练”为主题,分享了HBl

    2024年02月08日
    浏览(27)
  • Unity 场景加载和资源加载

    一个游戏往往都是由很多场景组成的,例如会有主界面场景、战斗场景…等,不同的场景也是由若干的资源组合而成,在游戏的制作过程中,场景和资源的加载是不可或缺的。不管是场景还是资源都会涉及到加载的问题,在什么时候进行场景或资源的加载?场景的加载和资源

    2024年02月04日
    浏览(29)
  • Unity使用 Addressables 预加载所有资源,提现加载资源,发布webgl加载缓慢问题

    Addressables 我也是刚接触,知道的不是很多,基本的用法还是知道一些的 1 .在Window–Package Manager里找到Addressables进行安装   2.选择资源,点击Assets中的一个资源,在Inspector面板上就会出现一个勾选Assressable,也就是是否加入资源打包的分组,和AssetBundle分组是一个性质。选上以

    2023年04月08日
    浏览(36)
  • Unity资源加载方式

    Resources:逻辑资源目录,这个目录中的资源会 打入到包 中, 不允许热更 。在打包时会被压缩和加密。 加载方式:Resources.Load(常用) 、 AssetDatabase.LoadAssetAtPath等加载接口 StreamingAssets:Raw资源目录,这个目录中的资源也会 打入到包 中,且允许程序通过Application.streamingAsse

    2023年04月09日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包