ue3d介绍Addressables生命周期Addler管理库

介绍Addressables生命周期Addler管理库

分类:

Addler 1.0.0正式发布时间是2023年1月24日,本文将简单介绍一下Addler生命周期管理库,它是Unity可寻址资源系统的内存管理系统,提供加载资源的生命周期管理系统、对象池系统和预加载系统。

Addler是什么?

可寻址资产系统要求在不再需要时显式释放已加载的资源。

// 加载
var handle = Addressables.LoadAssetAsync<GameObject>("FooPrefab");
await handle.Task;

// 发布
Addressables.Release(handle);

忘记这样做会导致内存泄漏,最终会产生导致严重的问题,Addler通过将资源生命周期与游戏对象相关联来简化内存管理。

var fooObj = new GameObject();

// 将资源生命周期与 fooObj 绑定
// fooObj 销毁的同时资源被释放
Addressables.LoadAssetAsync<GameObject>("BarPrefab").BindTo(fooObj);

上面的代码fooObj将在销毁后立即释放资源,这样就不必担心忘记发布。

ue3d - 介绍Addressables生命周期Addler管理库

它还实现了预加载功能,提前加载资源并同步检索它们,以及池化Prefab实例并重用它们的功能。

ue3d - 介绍Addressables生命周期Addler管理库

此外,这些生命周期也可以绑定到游戏对象等。

Addler是一个以这种方式正确管理Addressable中资源生命周期的库。

安装

  1. 从unity窗口 → 包管理器 → 打开包管理器
  2. 点+按钮 → 从 git URL 添加包
  3. 进入https://github.com/Haruma-K/Addler.git?path=/Packages/com.harumak.addler
ue3d - 介绍Addressables生命周期Addler管理库

或者打开Packages/manifest.json并将以下内容添加到依赖项块中:

{
    "dependencies": {
        "com.harumak.addler": "https://github.com/Haruma-K/Addler.git?path=/Packages/com.harumak.addler"
    }
}

如果要指定版本,则如下写。

https://github.com/Haruma-K/Addler.git?path=/Packages/com.harumak.addler#1.0.0

绑定生命周期

要绑定Addressable读取的资源的生命周期,请在Addressables.LoadAsssetAsync().之后编写BindTo()

// 加载资源并将句柄的生命周期绑定到游戏对象
var handle = Addressables.LoadAssetAsync<GameObject>("FooPrefab").BindTo(gameObject);
await handle.Task;
var prefab = handle.Result;

// 销毁游戏对象并释放手柄
Destroy(gameObject);

现在资源将在游戏对象被销毁的同时被释放,Lifetime还可以绑定到GameObjects以外的对象(稍后描述)。

预载

Addressables仅提供异步加载资源的API 。

// 异步加载
var handle = Addressables.LoadAssetAsync<GameObject>("FooPrefab");
await handle.Task;

然而,在实践中,很可能希望在加载屏幕中预加载资源并在游戏期间同步加载它们,预加载器是用于执行该处理的功能。

如何使用预加载器

预加载器实例化并使用AddressablesPreloader一个类。

// 创建预加载器
var preloader = new AddressablesPreloader();

// 预载
await preloader.PreloadAsync("FooPrefab", "BarPrefab");

// 同步获取预加载资源
var fooPrefab = preloader.Get<GameObject>("FooPrefab");
var barPrefab = preloader.Get<GameObject>("BarPrefab");

// 释放所有资源
preloader.Dispose();

AddressablesPreloader.PreloadAsync()将加载作为参数传递的地址指向的所有资源。

AddressablesPreloader.Get()方法允许同步检索预加载的资源。

当使用完预加载器后,AddressablesPool.Dispose()所有资源都会通过调用来释放。

绑定预加载器生命周期

还可以绑定预加载器生命周期。

// 绑定预加载器生命周期
var preloader = new AddressablesPreloader().BindTo(gameObject);

当预加载器生命周期结束时,所有资源都会被释放。

对象池

Unity游戏使用许多实例化Prefabs的GameObjects。然而,实例化和销毁预制件的成本很高,而且经常这样做会导致性能不佳。

例如,在生成同一个Prefab的多个实例的情况下,比如子弹,预先生成一定数量的实例并重复使用,以防止性能下降,这称为对象池。

ue3d - 介绍Addressables生命周期Addler管理库

Addler实现了处理可寻址资产系统中的对象池的功能。

使用对象池

对象池实例化并使用AddressablesPool类。

// 创建 FooPrefabs 池
var pool = new AddressablesPool("FooPrefab");

// 实例化
await pool.WarmupAsync(5);

// 从池中获取一个实例
var operation= pool.Use();
var instance = operation.Object;

// 将实例返回到池中
operation.Dispose();

// 销毁池并释放所有实例
pool.Dispose();

当调用AddressablesPool.WarmupAsync()时,将生成与参数中传递的数量一样多的预制件实例。

要从池中获取实例,请使用getAddressablesPool.Use()方法,可以从PooledObjectOperationthis 的Object属性中获取实例,PooledObjectOperation.Dispose()调用该方法将实例返回到池中。

使用完毕AddressablesPool.Dispose()后将池丢弃,所有实例都被销毁并释放资源。

绑定对象池生存期

还可以绑定对象池和从池中检索的对象的生命周期。

// 绑定池的生命周期
var pool = new AddressablesPool("FooPrefab").BindTo(gameObject1);

await pool.WarmupAsync(5);

// 绑定实例生命周期
// 当gameObject2被销毁时,实例将被返回到池中
var instance = pool.Use().BindTo(gameObject2).Object;

当从池中获取的对象的生存期结束时,将其返回到池中,当对象池的生存期结束时,所有实例都会被销毁并释放。

绑定到游戏对象以外的东西

生命周期也可以绑定到非游戏对象,要绑定到GameObject(游戏对象)以外的对象,请准备一个实现IEventDispatcher的类BindTo()并传递它。

Addler提供了一个类,用于将生命周期绑定到ParticleSystem的结束时间,此类作为IEventDispatcher的示例执行如下所示。

using System;
using UnityEngine;

namespace Addler.Runtime.Foundation.EventDispatcher
{
    [RequireComponent(typeof(ParticleSystem))]
    public class ParticleSystemFinishedEventDispatcher : MonoBehaviour, IEventDispatcher // Implement IEventDispatcher
    {
        private bool _isAliveAtLastFrame;
        private ParticleSystem _particleSystem;

        private void Awake()
        {
            _particleSystem = GetComponent<ParticleSystem>();
        }

        private void LateUpdate()
        {
            var isAlive = _particleSystem.IsAlive(true);
            if (_isAliveAtLastFrame && !isAlive)
            {
                // 当 ParticleSystem 完成时调用 OnDispatch
                OnDispatch?.Invoke();
            }

            _isAliveAtLastFrame = isAlive;
        }

        public event Action OnDispatch;
    }
}

使用许可

该软件是根据MIT许可证发布的,可以在许可范围内自由使用,但使用时需要版权声明和许可声明。

这里查看。

以上是关于Addressable的生命周期管理库的全部内容,如果你有任何反馈,请随时在本页面下方留言。

相关信息

  • 类型:知识
  • 字数:1029
  • 字符:6213
  • 适用软件:Unity
  • 说明:无
  • 编号:165230

热门内容

提示:3D天堂作为服务提供者,尊重网络版权及知识产权,对某些行为的发生不具备充分的监控能力,若无意间侵犯到您的权利,请 联系我们,我们会在收到信息后尽快给予处理。

本站文章版权归本站自创作者所有,未经允许不得转载!