From 04a646d330976c0f6960f54f89a08aba28aadfcf Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Thu, 6 Apr 2023 17:32:35 +0800 Subject: [PATCH] Update AssetGroup.cs --- .../GameFramework/Resource/AssetGroup.cs | 94 +++++++++++++------ 1 file changed, 65 insertions(+), 29 deletions(-) diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs index 409eebc1..f999ec04 100644 --- a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs +++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs @@ -16,6 +16,11 @@ namespace TEngine /// private AssetOperationHandle _handle; + /// + /// 资源操作句柄。 + /// + public AssetOperationHandle Handle => _handle; + /// /// 标签。 /// @@ -42,7 +47,7 @@ namespace TEngine /// 资源操作句柄。 /// 标签。 /// 资源句柄数据。 - public static AssetHandleData Alloc(AssetOperationHandle handle, string tag) + public static AssetHandleData Alloc(AssetOperationHandle handle, string tag = "") { AssetHandleData assetHandleData = MemoryPool.Acquire(); assetHandleData._handle = handle; @@ -67,12 +72,12 @@ namespace TEngine } /// - /// 资源分组数据。 + /// 资源组数据。 /// DisposeGroup。 /// public class AssetGroup : IMemory { - private Dictionary _handles = new Dictionary(16); + private GameFrameworkLinkedList _assetHandleDataLinkedList = new GameFrameworkLinkedList(); /// /// 注册资源数据到资源组内。 @@ -80,17 +85,10 @@ namespace TEngine /// 资源操作句柄。 /// 资源标识。 /// 是否注册成功。 - public bool Register(AssetOperationHandle handle, string tag = "ROOT") + public bool Register(AssetOperationHandle handle,string tag = "") { - if (_handles.TryGetValue(tag, out var handleData)) - { - _handles.Remove(tag); - AssetHandleData.Release(handleData); - handleData = null; - } - - handleData = AssetHandleData.Alloc(handle, tag); - _handles.Add(tag, handleData); + AssetHandleData handleData = AssetHandleData.Alloc(handle); + _assetHandleDataLinkedList.AddLast(handleData); return true; } @@ -101,28 +99,66 @@ namespace TEngine /// public bool UnRegister(string tag) { - if (_handles.TryGetValue(tag, out var handleData)) + AssetHandleData founded = null; + foreach (var assetHandleData in _assetHandleDataLinkedList) { - _handles.Remove(tag); - AssetHandleData.Release(handleData); + if (assetHandleData.Tag == tag) + { + founded = assetHandleData; + break; + } + } + + if (founded != null) + { + _assetHandleDataLinkedList.Remove(founded); + AssetHandleData.Release(founded); return true; } Log.Warning($"UnRegister AssetHandleData Tag:{tag} Failed"); return false; } + + /// + /// 从资源组内反注册资源数据。 + /// + /// + /// + public bool UnRegister(AssetOperationHandle handle) + { + AssetHandleData founded = null; + foreach (var assetHandleData in _assetHandleDataLinkedList) + { + if (assetHandleData.Handle == handle) + { + founded = assetHandleData; + break; + } + } + + if (founded != null) + { + _assetHandleDataLinkedList.Remove(founded); + AssetHandleData.Release(founded); + return true; + } + + Log.Warning($"UnRegister AssetHandleData Handle:{handle} Failed"); + return false; + } public void Clear() { - var etr = _handles.GetEnumerator(); + var etr = _assetHandleDataLinkedList.GetEnumerator(); while (etr.MoveNext()) { - AssetHandleData assetHandleData = etr.Current.Value; + AssetHandleData assetHandleData = etr.Current; AssetHandleData.Release(assetHandleData); } etr.Dispose(); - _handles.Clear(); + _assetHandleDataLinkedList.Clear(); } /// @@ -158,7 +194,7 @@ namespace TEngine /// 要加载资源的标签名称。 /// 要加载资源的类型。 /// 资源实例。 - public T LoadAsset(string assetName, string tag) where T : Object + public T LoadAsset(string assetName) where T : Object { if (string.IsNullOrEmpty(assetName)) { @@ -168,7 +204,7 @@ namespace TEngine AssetOperationHandle handle = YooAssets.LoadAssetSync(assetName); - Register(handle, tag); + Register(handle); if (typeof(T) == typeof(GameObject)) { @@ -189,7 +225,7 @@ namespace TEngine /// 要加载资源的标签名称。 /// 要加载资源的类型。 /// 资源实例。 - public T LoadAsset(string assetName, Transform parent, string tag) where T : Object + public T LoadAsset(string assetName, Transform parent) where T : Object { if (string.IsNullOrEmpty(assetName)) { @@ -199,7 +235,7 @@ namespace TEngine AssetOperationHandle handle = YooAssets.LoadAssetSync(assetName); - Register(handle, tag); + Register(handle); if (typeof(T) == typeof(GameObject)) { @@ -219,17 +255,17 @@ namespace TEngine /// 要加载资源的标签名称。 /// 取消操作Token。 /// 资源实实例。 - public async UniTask LoadAssetAsync(string assetName, string tag, CancellationToken cancellationToken) where T : Object + public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken) where T : Object { AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName); - Register(handle, tag); + Register(handle); bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow(); if (cancelOrFailed) { - UnRegister(tag); + UnRegister(handle); return null; } @@ -244,17 +280,17 @@ namespace TEngine /// 要加载资源的标签名称。 /// 取消操作Token。 /// 异步游戏物体实例。 - public async UniTask LoadGameObjectAsync(string assetName, string tag, CancellationToken cancellationToken) + public async UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken) { AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName); - Register(handle, tag); + Register(handle); bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow(); if (cancelOrFailed) { - UnRegister(tag); + UnRegister(handle); return null; }