更新资源模块接口

更新资源模块接口
This commit is contained in:
ALEXTANG
2023-10-16 13:03:41 +08:00
parent 8d2b4200d6
commit 5e70e7972e
3 changed files with 113 additions and 43 deletions

View File

@@ -164,18 +164,20 @@ namespace TEngine
/// 同步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
T LoadAsset<T>(string location) where T : Object;
T LoadAsset<T>(string location, bool needInstance) where T : Object;
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
T LoadAsset<T>(string location, Transform parent) where T : Object;
T LoadAsset<T>(string location, Transform parent, bool needInstance) where T : Object;
/// <summary>
/// 同步加载资源。
@@ -266,9 +268,10 @@ namespace TEngine
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns>
UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default) where T : Object;
UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default, bool needInstance = true) where T : Object;
/// <summary>
/// 异步加载游戏物体。

View File

@@ -90,6 +90,7 @@ namespace TEngine
/// 资源缓存表容量。
/// </summary>
public int ARCTableCapacity { get; set; }
#endregion
#region
@@ -101,10 +102,43 @@ namespace TEngine
internal override void Shutdown()
{
ReleaseAllHandle();
YooAssets.Destroy();
ResourcePool.Destroy();
}
private void ReleaseAllHandle()
{
var iter = _releaseMaps.Values.GetEnumerator();
while (iter.MoveNext())
{
AssetOperationHandle handle = iter.Current;
if (handle != null)
{
handle.Dispose();
handle = null;
}
}
iter.Dispose();
_releaseMaps.Clear();
iter = _operationHandlesMaps.Values.GetEnumerator();
while (iter.MoveNext())
{
AssetOperationHandle handle = iter.Current;
if (handle != null)
{
handle.Dispose();
handle = null;
}
}
iter.Dispose();
_operationHandlesMaps.Clear();
_arcCacheTable = new ArcCacheTable<string, AssetOperationHandle>(ARCTableCapacity, OnAddAsset, OnRemoveAsset);
}
#endregion
#region
@@ -141,10 +175,14 @@ namespace TEngine
private Dictionary<string, AssetOperationHandle> _releaseMaps;
private Dictionary<string, AssetOperationHandle> _operationHandlesMaps;
private ArcCacheTable<string, AssetOperationHandle> _arcCacheTable;
private void OnAddAsset(string location, AssetOperationHandle handle)
{
_operationHandlesMaps[location] = handle;
if (_releaseMaps.ContainsKey(location))
{
_releaseMaps.Remove(location);
@@ -153,6 +191,11 @@ namespace TEngine
private void OnRemoveAsset(string location, AssetOperationHandle handle)
{
if (_operationHandlesMaps.ContainsKey(location))
{
_operationHandlesMaps.Remove(location);
}
_releaseMaps[location] = handle;
GameModule.Resource.UnloadUnusedAssets(performGCCollect: false);
}
@@ -173,6 +216,7 @@ namespace TEngine
{
handle = YooAssets.LoadAssetSync<T>(location);
}
// 对象推入ARC缓存表。
_arcCacheTable.PutCache(location, handle);
return handle;
@@ -194,6 +238,7 @@ namespace TEngine
{
handle = YooAssets.LoadAssetAsync<T>(location);
}
// 对象推入ARC缓存表。
_arcCacheTable.PutCache(location, handle);
return handle;
@@ -221,6 +266,7 @@ namespace TEngine
ResourcePool.Initialize(GameModule.Get<ResourceModule>().gameObject);
_releaseMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity);
_operationHandlesMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity);
_arcCacheTable ??= new ArcCacheTable<string, AssetOperationHandle>(ARCTableCapacity, OnAddAsset, OnRemoveAsset);
}
@@ -317,6 +363,7 @@ namespace TEngine
handle = null;
}
}
iter.Dispose();
_releaseMaps.Clear();
@@ -451,9 +498,10 @@ namespace TEngine
/// 同步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location) where T : Object
public T LoadAsset<T>(string location, bool needInstance = true) where T : Object
{
if (string.IsNullOrEmpty(location))
{
@@ -464,10 +512,15 @@ namespace TEngine
AssetOperationHandle handle = GetHandleSync<T>(location);
if (typeof(T) == typeof(GameObject))
{
if (needInstance)
{
GameObject ret = handle.InstantiateSync();
return ret as T;
}
return handle.AssetObject as T;
}
else
{
T ret = handle.AssetObject as T;
@@ -480,9 +533,10 @@ namespace TEngine
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, Transform parent) where T : Object
public T LoadAsset<T>(string location, Transform parent, bool needInstance = true) where T : Object
{
if (string.IsNullOrEmpty(location))
{
@@ -494,9 +548,14 @@ namespace TEngine
if (typeof(T) == typeof(GameObject))
{
GameObject ret = handle.InstantiateSync(parent);
if (needInstance)
{
GameObject ret = handle.InstantiateSync();
return ret as T;
}
return handle.AssetObject as T;
}
else
{
T ret = handle.AssetObject as T;
@@ -661,8 +720,9 @@ namespace TEngine
/// </summary>
/// <param name="location">要加载的实例名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <returns>资源实实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default) where T : Object
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default, bool needInstance = true) where T : Object
{
AssetOperationHandle handle = LoadAssetAsyncHandle<T>(location);
@@ -674,11 +734,15 @@ namespace TEngine
}
if (typeof(T) == typeof(GameObject))
{
if (needInstance)
{
GameObject ret = handle.InstantiateSync();
return ret as T;
}
return handle.AssetObject as T;
}
else
{
return handle.AssetObject as T;

View File

@@ -448,11 +448,12 @@ namespace TEngine
/// 同步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location) where T : UnityEngine.Object
public T LoadAsset<T>(string location, bool needInstance = true) where T : UnityEngine.Object
{
return m_ResourceManager.LoadAsset<T>(location);
return m_ResourceManager.LoadAsset<T>(location, needInstance);
}
/// <summary>
@@ -460,11 +461,12 @@ namespace TEngine
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, Transform parent) where T : UnityEngine.Object
public T LoadAsset<T>(string location, Transform parent, bool needInstance = true) where T : UnityEngine.Object
{
return m_ResourceManager.LoadAsset<T>(location, parent);
return m_ResourceManager.LoadAsset<T>(location, parent, needInstance);
}
/// <summary>
@@ -608,11 +610,12 @@ namespace TEngine
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default) where T : UnityEngine.Object
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default, bool needInstance = true) where T : UnityEngine.Object
{
return await m_ResourceManager.LoadAssetAsync<T>(location, cancellationToken);
return await m_ResourceManager.LoadAssetAsync<T>(location, cancellationToken, needInstance);
}
/// <summary>