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

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