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> /// </summary>
private AssetOperationHandle _handle; private AssetOperationHandle _handle;
/// <summary>
/// 资源操作句柄。
/// </summary>
public AssetOperationHandle Handle => _handle;
/// <summary> /// <summary>
/// 标签。 /// 标签。
/// </summary> /// </summary>
@@ -42,7 +47,7 @@ namespace TEngine
/// <param name="handle">资源操作句柄。</param> /// <param name="handle">资源操作句柄。</param>
/// <param name="tag">标签。</param> /// <param name="tag">标签。</param>
/// <returns>资源句柄数据。</returns> /// <returns>资源句柄数据。</returns>
public static AssetHandleData Alloc(AssetOperationHandle handle, string tag) public static AssetHandleData Alloc(AssetOperationHandle handle, string tag = "")
{ {
AssetHandleData assetHandleData = MemoryPool.Acquire<AssetHandleData>(); AssetHandleData assetHandleData = MemoryPool.Acquire<AssetHandleData>();
assetHandleData._handle = handle; assetHandleData._handle = handle;
@@ -67,12 +72,12 @@ namespace TEngine
} }
/// <summary> /// <summary>
/// 资源组数据。 /// 资源组数据。
/// <remarks>DisposeGroup。</remarks> /// <remarks>DisposeGroup。</remarks>
/// </summary> /// </summary>
public class AssetGroup : IMemory public class AssetGroup : IMemory
{ {
private Dictionary<string, AssetHandleData> _handles = new Dictionary<string, AssetHandleData>(16); private GameFrameworkLinkedList<AssetHandleData> _assetHandleDataLinkedList = new GameFrameworkLinkedList<AssetHandleData>();
/// <summary> /// <summary>
/// 注册资源数据到资源组内。 /// 注册资源数据到资源组内。
@@ -80,17 +85,10 @@ namespace TEngine
/// <param name="handle">资源操作句柄。</param> /// <param name="handle">资源操作句柄。</param>
/// <param name="tag">资源标识。</param> /// <param name="tag">资源标识。</param>
/// <returns>是否注册成功。</returns> /// <returns>是否注册成功。</returns>
public bool Register(AssetOperationHandle handle, string tag = "ROOT") public bool Register(AssetOperationHandle handle,string tag = "")
{ {
if (_handles.TryGetValue(tag, out var handleData)) AssetHandleData handleData = AssetHandleData.Alloc(handle);
{ _assetHandleDataLinkedList.AddLast(handleData);
_handles.Remove(tag);
AssetHandleData.Release(handleData);
handleData = null;
}
handleData = AssetHandleData.Alloc(handle, tag);
_handles.Add(tag, handleData);
return true; return true;
} }
@@ -101,10 +99,20 @@ namespace TEngine
/// <returns></returns> /// <returns></returns>
public bool UnRegister(string tag) public bool UnRegister(string tag)
{ {
if (_handles.TryGetValue(tag, out var handleData)) AssetHandleData founded = null;
foreach (var assetHandleData in _assetHandleDataLinkedList)
{ {
_handles.Remove(tag); if (assetHandleData.Tag == tag)
AssetHandleData.Release(handleData); {
founded = assetHandleData;
break;
}
}
if (founded != null)
{
_assetHandleDataLinkedList.Remove(founded);
AssetHandleData.Release(founded);
return true; return true;
} }
@@ -112,17 +120,45 @@ namespace TEngine
return false; 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() public void Clear()
{ {
var etr = _handles.GetEnumerator(); var etr = _assetHandleDataLinkedList.GetEnumerator();
while (etr.MoveNext()) while (etr.MoveNext())
{ {
AssetHandleData assetHandleData = etr.Current.Value; AssetHandleData assetHandleData = etr.Current;
AssetHandleData.Release(assetHandleData); AssetHandleData.Release(assetHandleData);
} }
etr.Dispose(); etr.Dispose();
_handles.Clear(); _assetHandleDataLinkedList.Clear();
} }
/// <summary> /// <summary>
@@ -158,7 +194,7 @@ namespace TEngine
/// <param name="tag">要加载资源的标签名称。</param> /// <param name="tag">要加载资源的标签名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <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)) if (string.IsNullOrEmpty(assetName))
{ {
@@ -168,7 +204,7 @@ namespace TEngine
AssetOperationHandle handle = YooAssets.LoadAssetSync<T>(assetName); AssetOperationHandle handle = YooAssets.LoadAssetSync<T>(assetName);
Register(handle, tag); Register(handle);
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject))
{ {
@@ -189,7 +225,7 @@ namespace TEngine
/// <param name="tag">要加载资源的标签名称。</param> /// <param name="tag">要加载资源的标签名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <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)) if (string.IsNullOrEmpty(assetName))
{ {
@@ -199,7 +235,7 @@ namespace TEngine
AssetOperationHandle handle = YooAssets.LoadAssetSync<T>(assetName); AssetOperationHandle handle = YooAssets.LoadAssetSync<T>(assetName);
Register(handle, tag); Register(handle);
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject))
{ {
@@ -219,17 +255,17 @@ namespace TEngine
/// <param name="tag">要加载资源的标签名称。</param> /// <param name="tag">要加载资源的标签名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <returns>资源实实例。</returns> /// <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); AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle<GameObject>(assetName);
Register(handle, tag); Register(handle);
bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow(); bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow();
if (cancelOrFailed) if (cancelOrFailed)
{ {
UnRegister(tag); UnRegister(handle);
return null; return null;
} }
@@ -244,17 +280,17 @@ namespace TEngine
/// <param name="tag">要加载资源的标签名称。</param> /// <param name="tag">要加载资源的标签名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <returns>异步游戏物体实例。</returns> /// <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); AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle<GameObject>(assetName);
Register(handle, tag); Register(handle);
bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow(); bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow();
if (cancelOrFailed) if (cancelOrFailed)
{ {
UnRegister(tag); UnRegister(handle);
return null; return null;
} }