From 0c32dad70ba02107997d9a850eed0fc542d2c75d Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Fri, 12 May 2023 22:32:17 +0800 Subject: [PATCH] [+] LruAssetGroup [+] LruAssetGroup --- .../GameFramework/Resource/LruAssetGroup.cs | 350 ++++++++++++++++++ .../Resource/LruAssetGroup.cs.meta | 3 + 2 files changed, 353 insertions(+) create mode 100644 Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs.meta diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs b/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs new file mode 100644 index 00000000..d8e2dc05 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs @@ -0,0 +1,350 @@ +using System.Threading; +using Cysharp.Threading.Tasks; +using UnityEngine; +using YooAsset; + +namespace TEngine +{ + /// + /// 资源组数据。 + /// DisposeGroup。 + /// + public class LruAssetGroup : IMemory + { + private const int DefaultCapacity = 48; + private readonly LruCacheTable _lruCacheTable; + + public LruAssetGroup() + { + _lruCacheTable = new LruCacheTable(DefaultCapacity, OnAdd, OnRemove); + } + + private void OnAdd(AssetHandleData assetHandleData) + { + } + + private void OnRemove(AssetHandleData assetHandleData) + { + MemoryPool.Release(assetHandleData); + } + + /// + /// 引用资源数据到资源组内。 + /// + /// 资源操作句柄。 + /// 资源标识。 + /// 是否注册成功。 + public bool Reference(AssetOperationHandle handle, string assetTag = "") + { + AssetHandleData handleData = AssetHandleData.Alloc(handle, assetTag); + _lruCacheTable.Put(handleData.Handle.GetAssetInfo().Address,handleData); + return true; + } + + /// + /// 从资源组内释放资源数据。 + /// + /// 资源操作句柄。 + /// 是否释放成功。 + public bool Release(AssetOperationHandle handle) + { + _lruCacheTable.Remove(handle.GetAssetInfo().Address); + return true; + } + + public void Clear() + { + _lruCacheTable.Clear(); + } + + /// + /// 从内存池中获取资源分组数据。 + /// + /// 资源分组数据。 + public static LruAssetGroup Alloc() + { + LruAssetGroup assetGroup = MemoryPool.Acquire(); + + return assetGroup; + } + + /// + /// 将内存对象归还内存池。 + /// + /// + public static void Release(LruAssetGroup assetGroup) + { + if (assetGroup == null) + { + Log.Fatal("Release AssetGroup Failed !"); + return; + } + + MemoryPool.Release(assetGroup); + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(string assetName) where T : Object + { + if (string.IsNullOrEmpty(assetName)) + { + Log.Error("Asset name is invalid."); + return default; + } + + var data = _lruCacheTable.Get(assetName); + if (data != null) + { + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = data.Handle.InstantiateSync(); + return ret as T; + } + else + { + return data.Handle.AssetObject as T; + } + } + + AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation(assetName); + + Reference(handle); + + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = handle.InstantiateSync(); + return ret as T; + } + else + { + return handle.AssetObject as T; + } + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 父节点位置。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(string assetName, Transform parent) where T : Object + { + if (string.IsNullOrEmpty(assetName)) + { + Log.Error("Asset name is invalid."); + return default; + } + + var data = _lruCacheTable.Get(assetName); + if (data != null) + { + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = data.Handle.InstantiateSync(); + return ret as T; + } + else + { + return data.Handle.AssetObject as T; + } + } + + AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation(assetName); + + Reference(handle); + + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = handle.InstantiateSync(parent); + return ret as T; + } + else + { + return handle.AssetObject as T; + } + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 要加载资源的类型。 + /// 资源操作句柄。 + /// 资源实例。 + public T LoadAsset(string assetName, out AssetOperationHandle assetOperationHandle) where T : Object + { + assetOperationHandle = null; + if (string.IsNullOrEmpty(assetName)) + { + Log.Error("Asset name is invalid."); + return default; + } + + var data = _lruCacheTable.Get(assetName); + if (data != null) + { + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = data.Handle.InstantiateSync(); + return ret as T; + } + else + { + return data.Handle.AssetObject as T; + } + } + + + assetOperationHandle = GameModule.Resource.LoadAssetGetOperation(assetName); + + Reference(assetOperationHandle); + + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = assetOperationHandle.InstantiateSync(); + return ret as T; + } + else + { + return assetOperationHandle.AssetObject as T; + } + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 父节点位置。 + /// 资源操作句柄。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle) + where T : Object + { + assetOperationHandle = null; + if (string.IsNullOrEmpty(assetName)) + { + Log.Error("Asset name is invalid."); + return default; + } + + var data = _lruCacheTable.Get(assetName); + if (data != null) + { + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = data.Handle.InstantiateSync(); + return ret as T; + } + else + { + return data.Handle.AssetObject as T; + } + } + + assetOperationHandle = GameModule.Resource.LoadAssetGetOperation(assetName); + + Reference(assetOperationHandle); + + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = assetOperationHandle.InstantiateSync(parent); + return ret as T; + } + else + { + return assetOperationHandle.AssetObject as T; + } + } + + /// + /// 异步加载资源实例。 + /// + /// 要加载的实例名称。 + /// 取消操作Token。 + /// 资源操作句柄。 + /// 资源实实例。 + // ReSharper disable once UnusedParameter.Global + // ReSharper disable once RedundantAssignment + public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken, + AssetOperationHandle assetOperationHandle = null) where T : Object + { + + if (string.IsNullOrEmpty(assetName)) + { + Log.Error("Asset name is invalid."); + return default; + } + + var data = _lruCacheTable.Get(assetName); + if (data != null) + { + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = data.Handle.InstantiateSync(); + return ret as T; + } + else + { + return data.Handle.AssetObject as T; + } + } + + AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName); + + Reference(handle); + + bool cancelOrFailed = + await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow(); + + if (cancelOrFailed) + { + Release(handle); + + return null; + } + + assetOperationHandle = handle; + + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = handle.InstantiateSync(); + return ret as T; + } + else + { + return handle.AssetObject as T; + } + } + + /// + /// 异步加载游戏物体。 + /// + /// 要加载的游戏物体名称。 + /// 取消操作Token。 + /// 异步游戏物体实例。 + public async UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken) + { + return await LoadAssetAsync(assetName, cancellationToken); + } + + /// + /// 异步加载游戏物体。 + /// + /// 要加载的游戏物体名称。 + /// 取消操作Token。 + /// 资源操作句柄。 + /// 异步游戏物体实例。 + public async UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken, + AssetOperationHandle assetOperationHandle) + { + return await LoadAssetAsync(assetName, cancellationToken, assetOperationHandle); + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs.meta b/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs.meta new file mode 100644 index 00000000..bd54fe60 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Resource/LruAssetGroup.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 00d66c24e74646e8a798cf3f9b6f68c3 +timeCreated: 1683897392 \ No newline at end of file