优化资源引用类与资源分组类。

This commit is contained in:
ALEXTANG
2023-12-06 17:57:52 +08:00
parent 15735c3d2d
commit d799f9fdf0
2 changed files with 102 additions and 201 deletions

View File

@@ -22,7 +22,8 @@ namespace TEngine
public AssetOperationHandle Handle => _handle;
/// <summary>
/// 标签。
/// 自定义资源标签。
/// <remarks>不同于AssetTag。</remarks>
/// </summary>
public string Tag { private set; get; }
@@ -78,7 +79,8 @@ namespace TEngine
public class AssetGroup : IMemory
{
private readonly Dictionary<string,AssetHandleData> _assetHandleDataMap = new Dictionary<string,AssetHandleData>();
#region
/// <summary>
/// 引用资源数据到资源组内。
/// </summary>
@@ -105,32 +107,38 @@ namespace TEngine
_assetHandleDataMap[address] = handleData;
return true;
}
#endregion
#region
private readonly List<AssetHandleData> _tempResult = new List<AssetHandleData>();
/// <summary>
/// 从资源组内释放资源数据。
/// </summary>
/// <param name="assetTag">资源标签。</param>
/// <param name="tag">自定义资源标签。</param>
/// <returns>是否释放成功。</returns>
public bool ReleaseByTag(string assetTag)
public bool ReleaseByTag(string tag)
{
AssetHandleData founded = null;
_tempResult.Clear();
foreach (var assetHandleData in _assetHandleDataMap.Values)
{
if (assetHandleData.Tag == assetTag)
if (assetHandleData.Tag == tag)
{
founded = assetHandleData;
break;
_tempResult.Add(assetHandleData);
}
}
if (founded != null)
if (_tempResult.Count > 0)
{
_assetHandleDataMap.Remove(founded.Handle.GetAssetInfo().Address);
AssetHandleData.Release(founded);
foreach (var founded in _tempResult)
{
_assetHandleDataMap.Remove(founded.Handle.GetAssetInfo().Address);
AssetHandleData.Release(founded);
}
return true;
}
Log.Warning($"Release AssetHandleData Tag:{assetTag} Failed");
Log.Warning($"Release AssetHandleData Tag:{tag} Failed");
return false;
}
@@ -178,20 +186,9 @@ namespace TEngine
Log.Warning($"Release AssetHandleData Handle:{handle} Failed");
return false;
}
#endregion
public void Clear()
{
var etr = _assetHandleDataMap.GetEnumerator();
while (etr.MoveNext())
{
AssetHandleData assetHandleData = etr.Current.Value;
AssetHandleData.Release(assetHandleData);
}
etr.Dispose();
_assetHandleDataMap.Clear();
}
#region
/// <summary>
/// 从内存池中获取资源分组数据。
/// </summary>
@@ -216,25 +213,41 @@ namespace TEngine
MemoryPool.Release(assetGroup);
}
public void Clear()
{
var etr = _assetHandleDataMap.GetEnumerator();
while (etr.MoveNext())
{
AssetHandleData assetHandleData = etr.Current.Value;
AssetHandleData.Release(assetHandleData);
}
etr.Dispose();
_assetHandleDataMap.Clear();
}
#endregion
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, Transform parent = null) where T : Object
public T LoadAsset<T>(string location, bool needInstance = true,string packageName = "",Transform parent = null) where T : Object
{
if (string.IsNullOrEmpty(assetName))
if (string.IsNullOrEmpty(location))
{
Log.Error("Asset name is invalid.");
return default;
}
if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData))
if (_assetHandleDataMap.TryGetValue(location,out var assetHandleData))
{
if (typeof(T) == typeof(GameObject))
if (typeof(T) == typeof(GameObject) && needInstance)
{
GameObject ret = assetHandleData.Handle.InstantiateSync(parent);
return ret as T;
@@ -245,11 +258,20 @@ namespace TEngine
}
}
AssetOperationHandle handle = YooAssets.LoadAssetSync<T>(assetName);
AssetOperationHandle handle;
if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadAssetSync<T>(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadAssetSync<T>(location);
}
Reference(handle);
if (typeof(T) == typeof(GameObject))
if (typeof(T) == typeof(GameObject) && needInstance)
{
GameObject ret = handle.InstantiateSync(parent);
return ret as T;
@@ -259,115 +281,29 @@ namespace TEngine
return handle.AssetObject as T;
}
}
/// <summary>
/// 步加载资源。
/// 步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName,out AssetOperationHandle assetOperationHandle) where T : Object
{
assetOperationHandle = null;
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 = YooAssets.LoadAssetSync<T>(assetName);
Reference(assetOperationHandle);
if (typeof(T) == typeof(GameObject))
{
GameObject ret = assetOperationHandle.InstantiateSync();
return ret as T;
}
else
{
return assetOperationHandle.AssetObject as T;
}
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, Transform parent,out AssetOperationHandle assetOperationHandle) where T : Object
{
assetOperationHandle = null;
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(parent);
return ret as T;
}
else
{
return assetHandleData.Handle.AssetObject as T;
}
}
assetOperationHandle = YooAssets.LoadAssetSync<T>(assetName);
Reference(assetOperationHandle);
if (typeof(T) == typeof(GameObject))
{
GameObject ret = assetOperationHandle.InstantiateSync(parent);
return ret as T;
}
else
{
return assetOperationHandle.AssetObject as T;
}
}
/// <summary>
/// 异步加载资源实例。
/// </summary>
/// <param name="assetName">要加载的实例名称。</param>
/// <param name="location">资源的定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>资源实实例。</returns>
// ReSharper disable once UnusedParameter.Global
// ReSharper disable once RedundantAssignment
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken = default) where T : Object
/// <param name="needInstance">是否需要实例。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
/// <param name="parent">资源实例父节点。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
bool needInstance = true, string packageName = "", Transform parent = null) where T : Object
{
if (string.IsNullOrEmpty(assetName))
if (string.IsNullOrEmpty(location))
{
Log.Error("Asset name is invalid.");
return default;
}
if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData))
if (_assetHandleDataMap.TryGetValue(location,out var assetHandleData))
{
if (typeof(T) == typeof(GameObject))
if (typeof(T) == typeof(GameObject) && needInstance)
{
GameObject ret = assetHandleData.Handle.InstantiateSync();
return ret as T;
@@ -378,7 +314,16 @@ namespace TEngine
}
}
AssetOperationHandle handle = YooAssets.LoadAssetAsync<T>(assetName);
AssetOperationHandle handle;
if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadAssetSync<T>(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadAssetSync<T>(location);
}
Reference(handle);
@@ -391,9 +336,9 @@ namespace TEngine
return null;
}
if (typeof(T) == typeof(GameObject))
if (typeof(T) == typeof(GameObject) && needInstance)
{
GameObject ret = handle.InstantiateSync();
GameObject ret = handle.InstantiateSync(parent);
return ret as T;
}
else
@@ -401,16 +346,5 @@ namespace TEngine
return handle.AssetObject as T;
}
}
/// <summary>
/// 异步加载游戏物体。
/// </summary>
/// <param name="assetName">要加载的游戏物体名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken = default)
{
return await LoadAssetAsync<GameObject>(assetName,cancellationToken);
}
}
}

View File

@@ -153,82 +153,49 @@ namespace TEngine
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName) where T : Object
{
DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, Transform parent) where T : Object
public T LoadAsset<T>(string location, bool needInstance = true,string packageName = "",Transform parent = null) where T : Object
{
DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName, parent);
return _assetGroup.LoadAsset<T>(location, needInstance, packageName, parent);
}
/// <summary>
/// 步加载资源。
/// 步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>资源实例。</returns>
// ReSharper disable once ParameterHidesMember
public T LoadAsset<T>(string assetName, out AssetOperationHandle assetOperationHandle) where T : Object
{
DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName, out assetOperationHandle);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="parent">父节点位置。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>资源实例。</returns>
// ReSharper disable once ParameterHidesMember
public T LoadAsset<T>(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle)
where T : Object
{
DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName, parent, out assetOperationHandle);
}
/// <summary>
/// 异步加载资源实例。
/// </summary>
/// <param name="assetName">要加载的实例名称。</param>
/// <param name="location">资源的定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>资源实实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken = default)
where T : Object
/// <param name="needInstance">是否需要实例。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
/// <param name="parent">资源实例父节点。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
bool needInstance = true, string packageName = "", Transform parent = null) where T : Object
{
DirtyInitAssetGroup();
return await _assetGroup.LoadAssetAsync<T>(assetName, cancellationToken);
return await _assetGroup.LoadAssetAsync<T>(location, cancellationToken, needInstance, packageName, parent);
}
/// <summary>
/// 异步加载游戏物体。
/// </summary>
/// <param name="assetName">要加载的游戏物体名称。</param>
/// <param name="location">资源的定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName,
CancellationToken cancellationToken = default)
/// <param name="needInstance">是否需要实例。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
/// <param name="parent">资源实例父节点。</param>
/// <returns>异步资源实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location, CancellationToken cancellationToken = default,
bool needInstance = true, string packageName = "", Transform parent = null)
{
DirtyInitAssetGroup();
return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken);
return await LoadAssetAsync<GameObject>(location, cancellationToken, needInstance, packageName, parent);
}
/// <summary>