mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
[+] AssetReference
[+] AssetReference
This commit is contained in:
@@ -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,7 +77,7 @@ 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>
|
||||||
/// 引用资源数据到资源组内。
|
/// 引用资源数据到资源组内。
|
||||||
@@ -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,7 +224,7 @@ 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))
|
||||||
{
|
{
|
||||||
@@ -230,6 +232,19 @@ namespace TEngine
|
|||||||
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);
|
||||||
|
|
||||||
Reference(handle);
|
Reference(handle);
|
||||||
@@ -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);
|
||||||
|
@@ -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>
|
||||||
/// 同步加载资源。
|
/// 同步加载资源。
|
||||||
|
@@ -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>
|
||||||
/// 同步加载资源。
|
/// 同步加载资源。
|
||||||
|
Reference in New Issue
Block a user