Update AssetGroup.cs

This commit is contained in:
ALEXTANG
2023-04-06 17:32:35 +08:00
parent 9375c0acec
commit 04a646d330

View File

@@ -16,6 +16,11 @@ namespace TEngine
/// </summary>
private AssetOperationHandle _handle;
/// <summary>
/// 资源操作句柄。
/// </summary>
public AssetOperationHandle Handle => _handle;
/// <summary>
/// 标签。
/// </summary>
@@ -42,7 +47,7 @@ namespace TEngine
/// <param name="handle">资源操作句柄。</param>
/// <param name="tag">标签。</param>
/// <returns>资源句柄数据。</returns>
public static AssetHandleData Alloc(AssetOperationHandle handle, string tag)
public static AssetHandleData Alloc(AssetOperationHandle handle, string tag = "")
{
AssetHandleData assetHandleData = MemoryPool.Acquire<AssetHandleData>();
assetHandleData._handle = handle;
@@ -67,12 +72,12 @@ namespace TEngine
}
/// <summary>
/// 资源组数据。
/// 资源组数据。
/// <remarks>DisposeGroup。</remarks>
/// </summary>
public class AssetGroup : IMemory
{
private Dictionary<string, AssetHandleData> _handles = new Dictionary<string, AssetHandleData>(16);
private GameFrameworkLinkedList<AssetHandleData> _assetHandleDataLinkedList = new GameFrameworkLinkedList<AssetHandleData>();
/// <summary>
/// 注册资源数据到资源组内。
@@ -80,17 +85,10 @@ namespace TEngine
/// <param name="handle">资源操作句柄。</param>
/// <param name="tag">资源标识。</param>
/// <returns>是否注册成功。</returns>
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
/// <returns></returns>
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;
}
/// <summary>
/// 从资源组内反注册资源数据。
/// </summary>
/// <param name="handle"></param>
/// <returns></returns>
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();
}
/// <summary>
@@ -158,7 +194,7 @@ namespace TEngine
/// <param name="tag">要加载资源的标签名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, string tag) where T : Object
public T LoadAsset<T>(string assetName) where T : Object
{
if (string.IsNullOrEmpty(assetName))
{
@@ -168,7 +204,7 @@ namespace TEngine
AssetOperationHandle handle = YooAssets.LoadAssetSync<T>(assetName);
Register(handle, tag);
Register(handle);
if (typeof(T) == typeof(GameObject))
{
@@ -189,7 +225,7 @@ namespace TEngine
/// <param name="tag">要加载资源的标签名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, Transform parent, string tag) where T : Object
public T LoadAsset<T>(string assetName, Transform parent) where T : Object
{
if (string.IsNullOrEmpty(assetName))
{
@@ -199,7 +235,7 @@ namespace TEngine
AssetOperationHandle handle = YooAssets.LoadAssetSync<T>(assetName);
Register(handle, tag);
Register(handle);
if (typeof(T) == typeof(GameObject))
{
@@ -219,17 +255,17 @@ namespace TEngine
/// <param name="tag">要加载资源的标签名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>资源实实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string assetName, string tag, CancellationToken cancellationToken) where T : Object
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken) where T : Object
{
AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle<GameObject>(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
/// <param name="tag">要加载资源的标签名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, string tag, CancellationToken cancellationToken)
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken)
{
AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle<GameObject>(assetName);
Register(handle, tag);
Register(handle);
bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow();
if (cancelOrFailed)
{
UnRegister(tag);
UnRegister(handle);
return null;
}