更新资源模块接口

更新资源模块接口
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

@@ -61,7 +61,7 @@ namespace TEngine
/// 获取或设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒)。 /// 获取或设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒)。
/// </summary> /// </summary>
long Milliseconds { get; set; } long Milliseconds { get; set; }
/// <summary> /// <summary>
/// 资源缓存表容量。 /// 资源缓存表容量。
/// </summary> /// </summary>
@@ -164,18 +164,20 @@ namespace TEngine
/// 同步加载资源。 /// 同步加载资源。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
T LoadAsset<T>(string location) where T : Object; T LoadAsset<T>(string location, bool needInstance) where T : Object;
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <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> /// <summary>
/// 同步加载资源。 /// 同步加载资源。
@@ -239,7 +241,7 @@ namespace TEngine
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns> /// <returns>资源对象集合。</returns>
UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag) where T : UnityEngine.Object; UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag) where T : UnityEngine.Object;
/// <summary> /// <summary>
/// 异步加载场景。 /// 异步加载场景。
/// </summary> /// </summary>
@@ -248,7 +250,7 @@ namespace TEngine
/// <param name="suspendLoad">加载完毕时是否主动挂起。</param> /// <param name="suspendLoad">加载完毕时是否主动挂起。</param>
/// <param name="priority">优先级。</param> /// <param name="priority">优先级。</param>
/// <returns>异步加载场景句柄。</returns> /// <returns>异步加载场景句柄。</returns>
SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false,int priority = 100); SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100);
/// <summary> /// <summary>
/// 异步加载场景. /// 异步加载场景.
@@ -266,9 +268,10 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns> /// <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> /// <summary>
/// 异步加载游戏物体。 /// 异步加载游戏物体。

View File

@@ -90,6 +90,7 @@ namespace TEngine
/// 资源缓存表容量。 /// 资源缓存表容量。
/// </summary> /// </summary>
public int ARCTableCapacity { get; set; } public int ARCTableCapacity { get; set; }
#endregion #endregion
#region #region
@@ -101,10 +102,43 @@ namespace TEngine
internal override void Shutdown() internal override void Shutdown()
{ {
ReleaseAllHandle();
YooAssets.Destroy(); YooAssets.Destroy();
ResourcePool.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 #endregion
#region #region
@@ -140,23 +174,32 @@ namespace TEngine
#endregion #endregion
private Dictionary<string, AssetOperationHandle> _releaseMaps; private Dictionary<string, AssetOperationHandle> _releaseMaps;
private Dictionary<string, AssetOperationHandle> _operationHandlesMaps;
private ArcCacheTable<string, AssetOperationHandle> _arcCacheTable; private ArcCacheTable<string, AssetOperationHandle> _arcCacheTable;
private void OnAddAsset(string location,AssetOperationHandle handle)
private void OnAddAsset(string location, AssetOperationHandle handle)
{ {
_operationHandlesMaps[location] = handle;
if (_releaseMaps.ContainsKey(location)) if (_releaseMaps.ContainsKey(location))
{ {
_releaseMaps.Remove(location); _releaseMaps.Remove(location);
} }
} }
private void OnRemoveAsset(string location,AssetOperationHandle handle) private void OnRemoveAsset(string location, AssetOperationHandle handle)
{ {
if (_operationHandlesMaps.ContainsKey(location))
{
_operationHandlesMaps.Remove(location);
}
_releaseMaps[location] = handle; _releaseMaps[location] = handle;
GameModule.Resource.UnloadUnusedAssets(performGCCollect:false); GameModule.Resource.UnloadUnusedAssets(performGCCollect: false);
} }
/// <summary> /// <summary>
/// 从缓存中获取同步资源句柄。 /// 从缓存中获取同步资源句柄。
/// </summary> /// </summary>
@@ -168,16 +211,17 @@ namespace TEngine
AssetOperationHandle handle = null; AssetOperationHandle handle = null;
// 尝试从从ARC缓存表取出对象。 // 尝试从从ARC缓存表取出对象。
handle = _arcCacheTable.GetCache(location); handle = _arcCacheTable.GetCache(location);
if (handle == null) if (handle == null)
{ {
handle = YooAssets.LoadAssetSync<T>(location); handle = YooAssets.LoadAssetSync<T>(location);
} }
// 对象推入ARC缓存表。 // 对象推入ARC缓存表。
_arcCacheTable.PutCache(location, handle); _arcCacheTable.PutCache(location, handle);
return handle; return handle;
} }
/// <summary> /// <summary>
/// 从缓存中获取异步资源句柄。 /// 从缓存中获取异步资源句柄。
/// </summary> /// </summary>
@@ -189,16 +233,17 @@ namespace TEngine
AssetOperationHandle handle = null; AssetOperationHandle handle = null;
// 尝试从从ARC缓存表取出对象。 // 尝试从从ARC缓存表取出对象。
handle = _arcCacheTable.GetCache(location); handle = _arcCacheTable.GetCache(location);
if (handle == null) if (handle == null)
{ {
handle = YooAssets.LoadAssetAsync<T>(location); handle = YooAssets.LoadAssetAsync<T>(location);
} }
// 对象推入ARC缓存表。 // 对象推入ARC缓存表。
_arcCacheTable.PutCache(location, handle); _arcCacheTable.PutCache(location, handle);
return handle; return handle;
} }
/// <summary> /// <summary>
/// 初始化资源模块。 /// 初始化资源模块。
/// </summary> /// </summary>
@@ -219,8 +264,9 @@ namespace TEngine
} }
ResourcePool.Initialize(GameModule.Get<ResourceModule>().gameObject); ResourcePool.Initialize(GameModule.Get<ResourceModule>().gameObject);
_releaseMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity); _releaseMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity);
_operationHandlesMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity);
_arcCacheTable ??= new ArcCacheTable<string, AssetOperationHandle>(ARCTableCapacity, OnAddAsset, OnRemoveAsset); _arcCacheTable ??= new ArcCacheTable<string, AssetOperationHandle>(ARCTableCapacity, OnAddAsset, OnRemoveAsset);
} }
@@ -277,7 +323,7 @@ namespace TEngine
createParameters.RemoteServices = new RemoteServices(); createParameters.RemoteServices = new RemoteServices();
initializationOperation = package.InitializeAsync(createParameters); initializationOperation = package.InitializeAsync(createParameters);
} }
// WebGL运行模式 // WebGL运行模式
if (playMode == EPlayMode.WebPlayMode) if (playMode == EPlayMode.WebPlayMode)
{ {
@@ -317,9 +363,10 @@ namespace TEngine
handle = null; handle = null;
} }
} }
iter.Dispose(); iter.Dispose();
_releaseMaps.Clear(); _releaseMaps.Clear();
if (DefaultPackage == null) if (DefaultPackage == null)
{ {
throw new GameFrameworkException("Package is invalid."); throw new GameFrameworkException("Package is invalid.");
@@ -451,9 +498,10 @@ namespace TEngine
/// 同步加载资源。 /// 同步加载资源。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <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)) if (string.IsNullOrEmpty(location))
{ {
@@ -465,8 +513,13 @@ namespace TEngine
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject))
{ {
GameObject ret = handle.InstantiateSync(); if (needInstance)
return ret as T; {
GameObject ret = handle.InstantiateSync();
return ret as T;
}
return handle.AssetObject as T;
} }
else else
{ {
@@ -480,9 +533,10 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <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)) if (string.IsNullOrEmpty(location))
{ {
@@ -494,8 +548,13 @@ namespace TEngine
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject))
{ {
GameObject ret = handle.InstantiateSync(parent); if (needInstance)
return ret as T; {
GameObject ret = handle.InstantiateSync();
return ret as T;
}
return handle.AssetObject as T;
} }
else else
{ {
@@ -542,7 +601,7 @@ namespace TEngine
public T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle) where T : Object public T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle) where T : Object
{ {
handle = GetHandleSync<T>(location); handle = GetHandleSync<T>(location);
if (string.IsNullOrEmpty(location)) if (string.IsNullOrEmpty(location))
{ {
Log.Error("Asset name is invalid."); Log.Error("Asset name is invalid.");
@@ -610,14 +669,14 @@ namespace TEngine
{ {
return YooAssets.LoadSubAssetsSync(assetInfo); return YooAssets.LoadSubAssetsSync(assetInfo);
} }
/// <summary> /// <summary>
/// 通过Tag加载资源对象集合。 /// 通过Tag加载资源对象集合。
/// </summary> /// </summary>
/// <param name="assetTag">资源标识。</param> /// <param name="assetTag">资源标识。</param>
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns> /// <returns>资源对象集合。</returns>
public async UniTask<List<T>>LoadAssetsByTagAsync<T>(string assetTag) where T: UnityEngine.Object public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag) where T : UnityEngine.Object
{ {
LoadAssetsByTagOperation<T> operation = new LoadAssetsByTagOperation<T>(assetTag); LoadAssetsByTagOperation<T> operation = new LoadAssetsByTagOperation<T>(assetTag);
YooAssets.StartOperation(operation); YooAssets.StartOperation(operation);
@@ -661,8 +720,9 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">要加载的实例名称。</param> /// <param name="location">要加载的实例名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <returns>资源实实例。</returns> /// <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); AssetOperationHandle handle = LoadAssetAsyncHandle<T>(location);
@@ -675,9 +735,13 @@ namespace TEngine
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject))
{ {
GameObject ret = handle.InstantiateSync(); if (needInstance)
{
GameObject ret = handle.InstantiateSync();
return ret as T;
}
return ret as T; return handle.AssetObject as T;
} }
else else
{ {

View File

@@ -102,7 +102,7 @@ namespace TEngine
/// 资源缓存表容量。 /// 资源缓存表容量。
/// </summary> /// </summary>
public int adaptiveReplacementCacheCapacity = 32; public int adaptiveReplacementCacheCapacity = 32;
private IResourceManager m_ResourceManager; private IResourceManager m_ResourceManager;
private AsyncOperation m_AsyncOperation = null; private AsyncOperation m_AsyncOperation = null;
private bool m_ForceUnloadUnusedAssets = false; private bool m_ForceUnloadUnusedAssets = false;
@@ -302,7 +302,7 @@ namespace TEngine
{ {
// YooAssets.ClearSandbox(); // YooAssets.ClearSandbox();
} }
/// <summary> /// <summary>
/// 卸载资源。 /// 卸载资源。
/// </summary> /// </summary>
@@ -311,7 +311,7 @@ namespace TEngine
{ {
m_ResourceManager.UnloadAsset(asset); m_ResourceManager.UnloadAsset(asset);
} }
/// <summary> /// <summary>
/// 预订执行释放未被使用的资源。 /// 预订执行释放未被使用的资源。
/// </summary> /// </summary>
@@ -343,7 +343,7 @@ namespace TEngine
m_LastUnloadUnusedAssetsOperationElapseSeconds += GameTime.unscaledDeltaTime; m_LastUnloadUnusedAssetsOperationElapseSeconds += GameTime.unscaledDeltaTime;
if (m_AsyncOperation == null && if (m_AsyncOperation == null &&
(m_ForceUnloadUnusedAssets || (m_ForceUnloadUnusedAssets ||
m_LastUnloadUnusedAssetsOperationElapseSeconds >= maxUnloadUnusedAssetsInterval || m_LastUnloadUnusedAssetsOperationElapseSeconds >= maxUnloadUnusedAssetsInterval ||
m_PreorderUnloadUnusedAssets && m_LastUnloadUnusedAssetsOperationElapseSeconds >= minUnloadUnusedAssetsInterval)) m_PreorderUnloadUnusedAssets && m_LastUnloadUnusedAssetsOperationElapseSeconds >= minUnloadUnusedAssetsInterval))
{ {
Log.Info("Unload unused assets..."); Log.Info("Unload unused assets...");
@@ -448,11 +448,12 @@ namespace TEngine
/// 同步加载资源。 /// 同步加载资源。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <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> /// <summary>
@@ -460,11 +461,12 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <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> /// <summary>
@@ -563,14 +565,14 @@ namespace TEngine
return m_ResourceManager.LoadSubAssetsSync(assetInfo); return m_ResourceManager.LoadSubAssetsSync(assetInfo);
} }
/// <summary> /// <summary>
/// 通过Tag加载资源对象集合。 /// 通过Tag加载资源对象集合。
/// </summary> /// </summary>
/// <param name="assetTag">资源标识。</param> /// <param name="assetTag">资源标识。</param>
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns> /// <returns>资源对象集合。</returns>
public async UniTask<List<T>>LoadAssetsByTagAsync<T>(string assetTag) where T: UnityEngine.Object public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag) where T : UnityEngine.Object
{ {
return await m_ResourceManager.LoadAssetsByTagAsync<T>(assetTag); return await m_ResourceManager.LoadAssetsByTagAsync<T>(assetTag);
} }
@@ -608,11 +610,12 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns> /// <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> /// <summary>