diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs index d816997a..934ca8c2 100644 --- a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs +++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System.Collections.Generic; +using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; using YooAsset; @@ -76,8 +77,8 @@ namespace TEngine /// public class AssetGroup : IMemory { - private readonly GameFrameworkLinkedList _assetHandleDataLinkedList = new GameFrameworkLinkedList(); - + private readonly Dictionary _assetHandleDataMap = new Dictionary(); + /// /// 引用资源数据到资源组内。 /// @@ -87,7 +88,21 @@ namespace TEngine public bool Reference(AssetOperationHandle handle,string assetTag = "") { AssetHandleData handleData = AssetHandleData.Alloc(handle,assetTag); - _assetHandleDataLinkedList.AddLast(handleData); + _assetHandleDataMap[handleData.Handle.GetAssetInfo().Address] = handleData; + return true; + } + + /// + /// 引用资源数据到资源组内。 + /// + /// 资源定位地址。 + /// 资源操作句柄。 + /// 资源标识。 + /// 是否注册成功。 + public bool Reference(string address,AssetOperationHandle handle,string assetTag = "") + { + AssetHandleData handleData = AssetHandleData.Alloc(handle,assetTag); + _assetHandleDataMap[address] = handleData; return true; } @@ -96,10 +111,10 @@ namespace TEngine /// /// 资源标签。 /// 是否释放成功。 - public bool Release(string assetTag) + public bool ReleaseByTag(string assetTag) { AssetHandleData founded = null; - foreach (var assetHandleData in _assetHandleDataLinkedList) + foreach (var assetHandleData in _assetHandleDataMap.Values) { if (assetHandleData.Tag == assetTag) { @@ -110,12 +125,29 @@ namespace TEngine if (founded != null) { - _assetHandleDataLinkedList.Remove(founded); + _assetHandleDataMap.Remove(founded.Handle.GetAssetInfo().Address); AssetHandleData.Release(founded); return true; } - Log.Warning($"UnRegister AssetHandleData Tag:{assetTag} Failed"); + Log.Warning($"Release AssetHandleData Tag:{assetTag} Failed"); + return false; + } + + /// + /// 从资源组内释放资源数据。 + /// + /// 资源定位地址。 + /// 是否释放成功。 + public bool Release(string address) + { + if (_assetHandleDataMap.TryGetValue(address,out var assetHandleData)) + { + _assetHandleDataMap.Remove(assetHandleData.Handle.GetAssetInfo().Address); + AssetHandleData.Release(assetHandleData); + return true; + } + Log.Warning($"Release AssetHandleData Address:{address} Failed"); return false; } @@ -127,7 +159,7 @@ namespace TEngine public bool Release(AssetOperationHandle handle) { AssetHandleData founded = null; - foreach (var assetHandleData in _assetHandleDataLinkedList) + foreach (var assetHandleData in _assetHandleDataMap.Values) { if (assetHandleData.Handle == handle) { @@ -138,26 +170,26 @@ namespace TEngine if (founded != null) { - _assetHandleDataLinkedList.Remove(founded); + _assetHandleDataMap.Remove(founded.Handle.GetAssetInfo().Address); AssetHandleData.Release(founded); return true; } - Log.Warning($"UnRegister AssetHandleData Handle:{handle} Failed"); + Log.Warning($"Release AssetHandleData Handle:{handle} Failed"); return false; } public void Clear() { - var etr = _assetHandleDataLinkedList.GetEnumerator(); + var etr = _assetHandleDataMap.GetEnumerator(); while (etr.MoveNext()) { - AssetHandleData assetHandleData = etr.Current; + AssetHandleData assetHandleData = etr.Current.Value; AssetHandleData.Release(assetHandleData); } etr.Dispose(); - _assetHandleDataLinkedList.Clear(); + _assetHandleDataMap.Clear(); } /// @@ -167,7 +199,6 @@ namespace TEngine public static AssetGroup Alloc() { AssetGroup assetGroup = MemoryPool.Acquire(); - return assetGroup; } @@ -186,35 +217,6 @@ namespace TEngine MemoryPool.Release(assetGroup); } - /// - /// 同步加载资源。 - /// - /// 要加载资源的名称。 - /// 要加载资源的类型。 - /// 资源实例。 - public T LoadAsset(string assetName) where T : Object - { - if (string.IsNullOrEmpty(assetName)) - { - Log.Error("Asset name is invalid."); - return default; - } - - 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; - } - } - /// /// 同步加载资源。 /// @@ -222,13 +224,26 @@ namespace TEngine /// 父节点位置。 /// 要加载资源的类型。 /// 资源实例。 - public T LoadAsset(string assetName, Transform parent) where T : Object + public T LoadAsset(string assetName, Transform parent = null) where T : Object { if (string.IsNullOrEmpty(assetName)) { Log.Error("Asset name is invalid."); return default; } + + if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) + { + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = assetHandleData.Handle.InstantiateSync(parent); + return ret as T; + } + else + { + return assetHandleData.Handle.AssetObject as T; + } + } AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation(assetName); @@ -260,10 +275,18 @@ namespace TEngine Log.Error("Asset name is invalid."); return default; } - if (string.IsNullOrEmpty(assetName)) + + if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) { - Log.Error("Asset name is invalid."); - return default; + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = assetHandleData.Handle.InstantiateSync(); + return ret as T; + } + else + { + return assetHandleData.Handle.AssetObject as T; + } } assetOperationHandle = GameModule.Resource.LoadAssetGetOperation(assetName); @@ -298,6 +321,19 @@ namespace TEngine return default; } + if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) + { + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = assetHandleData.Handle.InstantiateSync(); + return ret as T; + } + else + { + return assetHandleData.Handle.AssetObject as T; + } + } + assetOperationHandle = GameModule.Resource.LoadAssetGetOperation(assetName); Reference(assetOperationHandle); @@ -324,6 +360,25 @@ namespace TEngine // 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; + } + + if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) + { + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = assetHandleData.Handle.InstantiateSync(); + return ret as T; + } + else + { + return assetHandleData.Handle.AssetObject as T; + } + } + AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName); Reference(handle); diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetReference.cs b/Assets/TEngine/Runtime/GameFramework/Resource/AssetReference.cs index 68e086f2..c681ca99 100644 --- a/Assets/TEngine/Runtime/GameFramework/Resource/AssetReference.cs +++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetReference.cs @@ -74,15 +74,28 @@ namespace TEngine return _assetGroup.Reference(handle, assetTag); } + /// + /// 引用资源数据到资源组内。 + /// + /// 资源定位地址。 + /// 资源操作句柄。 + /// 资源标识。 + /// 是否注册成功。 + public bool Reference(string address, AssetOperationHandle handle, string assetTag = "") + { + DirtyInitAssetGroup(); + return _assetGroup.Reference(address, handle, assetTag); + } + /// /// 从资源组内释放资源数据。 /// /// /// - public bool Release(string assetTag) + public bool ReleaseByTag(string assetTag) { DirtyInitAssetGroup(); - return _assetGroup.Release(assetTag); + return _assetGroup.ReleaseByTag(assetTag); } /// @@ -96,6 +109,16 @@ namespace TEngine return _assetGroup.Release(handle); } + /// + /// 从资源组内释放资源数据。 + /// + /// 资源定位地址。 + /// 是否释放成功。 + public bool Release(string address) + { + DirtyInitAssetGroup(); + return _assetGroup.Release(address); + } /// /// 同步加载资源。 diff --git a/Assets/TEngine/Runtime/GameFramework/UI/UIBase.cs b/Assets/TEngine/Runtime/GameFramework/UI/UIBase.cs index 36b2fc74..cd8e0c09 100644 --- a/Assets/TEngine/Runtime/GameFramework/UI/UIBase.cs +++ b/Assets/TEngine/Runtime/GameFramework/UI/UIBase.cs @@ -494,25 +494,42 @@ namespace TEngine { if (AssetReference == null) { - Log.Fatal($"Register Failed => {this}.AssetReference is null"); + Log.Fatal($"Reference Failed => {this}.AssetReference is null"); return false; } return AssetReference.Reference(handle, assetTag); } + /// + /// 引用资源数据到资源组内。 + /// + /// 资源定位地址。 + /// 资源操作句柄。 + /// 资源标识。 + /// 是否注册成功。 + public bool Reference(string address, AssetOperationHandle handle, string assetTag = "") + { + if (AssetReference == null) + { + Log.Fatal($"Reference Failed => {this}.AssetReference is null"); + return false; + } + return AssetReference.Reference(address, handle, assetTag); + } + /// /// 从资源组内释放资源数据。 /// /// /// - public bool Release(string assetTag) + public bool ReleaseByTag(string assetTag) { if (AssetReference == null) { - Log.Fatal($"UnRegister Failed => {this}.AssetReference is null"); + Log.Fatal($"Release Failed => {this}.AssetReference is null"); return false; } - return AssetReference.Release(assetTag); + return AssetReference.ReleaseByTag(assetTag); } /// @@ -524,12 +541,26 @@ namespace TEngine { if (AssetReference == null) { - Log.Fatal($"UnRegister Failed => {this}.AssetReference is null"); + Log.Fatal($"Release Failed => {this}.AssetReference is null"); return false; } return AssetReference.Release(handle); } + /// + /// 从资源组内释放资源数据。 + /// + /// 资源定位地址。 + /// 是否释放成功。 + public bool Release(string address) + { + if (AssetReference == null) + { + Log.Fatal($"Release Failed => {this}.AssetReference is null"); + return false; + } + return AssetReference.Release(address); + } /// /// 同步加载资源。