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将在销毁后立即释放资源,这样就不必担心忘记发布。

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

此外,这些生命周期也可以绑定到游戏对象等。
Addler是一个以这种方式正确管理Addressable中资源生命周期的库。
安装
- 从unity窗口 → 包管理器 → 打开包管理器
- 点+按钮 → 从 git URL 添加包
- 进入https://github.com/Haruma-K/Addler.git?path=/Packages/com.harumak.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的多个实例的情况下,比如子弹,预先生成一定数量的实例并重复使用,以防止性能下降,这称为对象池。

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的生命周期管理库的全部内容,如果你有任何反馈,请随时在本页面下方留言。