[+] AssetReference

[+] AssetReference
This commit is contained in:
ALEXTANG
2023-05-12 22:31:27 +08:00
parent dfc8b5eb8f
commit c44c3e8c67
3 changed files with 164 additions and 55 deletions

View File

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

View File

@@ -74,15 +74,28 @@ namespace TEngine
return _assetGroup.Reference(handle, assetTag); return _assetGroup.Reference(handle, assetTag);
} }
/// <summary>
/// 引用资源数据到资源组内。
/// </summary>
/// <param name="address">资源定位地址。</param>
/// <param name="handle">资源操作句柄。</param>
/// <param name="assetTag">资源标识。</param>
/// <returns>是否注册成功。</returns>
public bool Reference(string address, AssetOperationHandle handle, string assetTag = "")
{
DirtyInitAssetGroup();
return _assetGroup.Reference(address, handle, assetTag);
}
/// <summary> /// <summary>
/// 从资源组内释放资源数据。 /// 从资源组内释放资源数据。
/// </summary> /// </summary>
/// <param name="assetTag"></param> /// <param name="assetTag"></param>
/// <returns></returns> /// <returns></returns>
public bool Release(string assetTag) public bool ReleaseByTag(string assetTag)
{ {
DirtyInitAssetGroup(); DirtyInitAssetGroup();
return _assetGroup.Release(assetTag); return _assetGroup.ReleaseByTag(assetTag);
} }
/// <summary> /// <summary>
@@ -96,6 +109,16 @@ namespace TEngine
return _assetGroup.Release(handle); return _assetGroup.Release(handle);
} }
/// <summary>
/// 从资源组内释放资源数据。
/// </summary>
/// <param name="address">资源定位地址。</param>
/// <returns>是否释放成功。</returns>
public bool Release(string address)
{
DirtyInitAssetGroup();
return _assetGroup.Release(address);
}
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。

View File

@@ -494,25 +494,42 @@ namespace TEngine
{ {
if (AssetReference == null) if (AssetReference == null)
{ {
Log.Fatal($"Register Failed => {this}.AssetReference is null"); Log.Fatal($"Reference Failed => {this}.AssetReference is null");
return false; return false;
} }
return AssetReference.Reference(handle, assetTag); return AssetReference.Reference(handle, assetTag);
} }
/// <summary>
/// 引用资源数据到资源组内。
/// </summary>
/// <param name="address">资源定位地址。</param>
/// <param name="handle">资源操作句柄。</param>
/// <param name="assetTag">资源标识。</param>
/// <returns>是否注册成功。</returns>
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);
}
/// <summary> /// <summary>
/// 从资源组内释放资源数据。 /// 从资源组内释放资源数据。
/// </summary> /// </summary>
/// <param name="assetTag"></param> /// <param name="assetTag"></param>
/// <returns></returns> /// <returns></returns>
public bool Release(string assetTag) public bool ReleaseByTag(string assetTag)
{ {
if (AssetReference == null) if (AssetReference == null)
{ {
Log.Fatal($"UnRegister Failed => {this}.AssetReference is null"); Log.Fatal($"Release Failed => {this}.AssetReference is null");
return false; return false;
} }
return AssetReference.Release(assetTag); return AssetReference.ReleaseByTag(assetTag);
} }
/// <summary> /// <summary>
@@ -524,12 +541,26 @@ namespace TEngine
{ {
if (AssetReference == null) if (AssetReference == null)
{ {
Log.Fatal($"UnRegister Failed => {this}.AssetReference is null"); Log.Fatal($"Release Failed => {this}.AssetReference is null");
return false; return false;
} }
return AssetReference.Release(handle); return AssetReference.Release(handle);
} }
/// <summary>
/// 从资源组内释放资源数据。
/// </summary>
/// <param name="address">资源定位地址。</param>
/// <returns>是否释放成功。</returns>
public bool Release(string address)
{
if (AssetReference == null)
{
Log.Fatal($"Release Failed => {this}.AssetReference is null");
return false;
}
return AssetReference.Release(address);
}
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。