From 6014793f756f6b765bed6043cd4137e007002eef Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Thu, 6 Apr 2023 13:40:03 +0800 Subject: [PATCH] AssetGroup AssetGroup --- .../GameFramework/Resource/AssetGroup.cs | 267 ++++++++++++++++++ .../GameFramework/Resource/AssetGroup.cs.meta | 3 + 2 files changed, 270 insertions(+) create mode 100644 Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs.meta diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs new file mode 100644 index 00000000..409eebc1 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs @@ -0,0 +1,267 @@ +using System.Collections.Generic; +using System.Threading; +using Cysharp.Threading.Tasks; +using UnityEngine; +using YooAsset; + +namespace TEngine +{ + /// + /// 资源句柄数据。 + /// + public class AssetHandleData : IMemory + { + /// + /// 资源操作句柄。 + /// + private AssetOperationHandle _handle; + + /// + /// 标签。 + /// + public string Tag { private set; get; } + + /// + /// 释放资源句柄数据对象。 + /// + public void Clear() + { + if (_handle != null) + { + _handle.Dispose(); + } + + _handle = null; + + Tag = string.Empty; + } + + /// + /// 从内存池中获取资源句柄数据。 + /// + /// 资源操作句柄。 + /// 标签。 + /// 资源句柄数据。 + public static AssetHandleData Alloc(AssetOperationHandle handle, string tag) + { + AssetHandleData assetHandleData = MemoryPool.Acquire(); + assetHandleData._handle = handle; + assetHandleData.Tag = tag; + return assetHandleData; + } + + /// + /// 释放资源句柄数据到内存池。 + /// + /// 释放资源句柄数据。 + public static void Release(AssetHandleData assetHandleData) + { + if (assetHandleData == null) + { + Log.Fatal("Release AssetHandleData Failed !"); + return; + } + + MemoryPool.Release(assetHandleData); + } + } + + /// + /// 资源分组数据。 + /// DisposeGroup。 + /// + public class AssetGroup : IMemory + { + private Dictionary _handles = new Dictionary(16); + + /// + /// 注册资源数据到资源组内。 + /// + /// 资源操作句柄。 + /// 资源标识。 + /// 是否注册成功。 + public bool Register(AssetOperationHandle handle, string tag = "ROOT") + { + if (_handles.TryGetValue(tag, out var handleData)) + { + _handles.Remove(tag); + AssetHandleData.Release(handleData); + handleData = null; + } + + handleData = AssetHandleData.Alloc(handle, tag); + _handles.Add(tag, handleData); + return true; + } + + /// + /// 从资源组内反注册资源数据。 + /// + /// + /// + public bool UnRegister(string tag) + { + if (_handles.TryGetValue(tag, out var handleData)) + { + _handles.Remove(tag); + AssetHandleData.Release(handleData); + return true; + } + + Log.Warning($"UnRegister AssetHandleData Tag:{tag} Failed"); + return false; + } + + public void Clear() + { + var etr = _handles.GetEnumerator(); + while (etr.MoveNext()) + { + AssetHandleData assetHandleData = etr.Current.Value; + AssetHandleData.Release(assetHandleData); + } + + etr.Dispose(); + _handles.Clear(); + } + + /// + /// 从内存池中获取资源分组数据。 + /// + /// 资源分组数据。 + public static AssetGroup Alloc() + { + AssetGroup assetGroup = MemoryPool.Acquire(); + + return assetGroup; + } + + /// + /// 将内存对象归还内存池。 + /// + /// + public static void Release(AssetGroup assetGroup) + { + if (assetGroup == null) + { + Log.Fatal("Release AssetGroup Failed !"); + return; + } + + MemoryPool.Release(assetGroup); + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 要加载资源的标签名称。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(string assetName, string tag) where T : Object + { + if (string.IsNullOrEmpty(assetName)) + { + Log.Error("Asset name is invalid."); + return default; + } + + AssetOperationHandle handle = YooAssets.LoadAssetSync(assetName); + + Register(handle, tag); + + 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, string tag) where T : Object + { + if (string.IsNullOrEmpty(assetName)) + { + Log.Error("Asset name is invalid."); + return default; + } + + AssetOperationHandle handle = YooAssets.LoadAssetSync(assetName); + + Register(handle, tag); + + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = handle.InstantiateSync(parent); + return ret as T; + } + else + { + return handle.AssetObject as T; + } + } + + /// + /// 异步加载资源实例。 + /// + /// 要加载的实例名称。 + /// 要加载资源的标签名称。 + /// 取消操作Token。 + /// 资源实实例。 + public async UniTask LoadAssetAsync(string assetName, string tag, CancellationToken cancellationToken) where T : Object + { + AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName); + + Register(handle, tag); + + bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow(); + + if (cancelOrFailed) + { + UnRegister(tag); + + return null; + } + + return handle.AssetObject as T; + } + + /// + /// 异步加载游戏物体。 + /// + /// 要加载的游戏物体名称。 + /// 要加载资源的标签名称。 + /// 取消操作Token。 + /// 异步游戏物体实例。 + public async UniTask LoadGameObjectAsync(string assetName, string tag, CancellationToken cancellationToken) + { + AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName); + + Register(handle, tag); + + bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow(); + + if (cancelOrFailed) + { + UnRegister(tag); + + return null; + } + + GameObject ret = handle.InstantiateSync(); + + return ret; + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs.meta b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs.meta new file mode 100644 index 00000000..041541ed --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0f5648c599534f53a62688f519d430f8 +timeCreated: 1680757246 \ No newline at end of file