diff --git a/Runtime/Resource/Resource/Extension/ResourceExtComponent.Resource.cs b/Runtime/Resource/Resource/Extension/ResourceExtComponent.Resource.cs
index e05dcf8..32eba83 100644
--- a/Runtime/Resource/Resource/Extension/ResourceExtComponent.Resource.cs
+++ b/Runtime/Resource/Resource/Extension/ResourceExtComponent.Resource.cs
@@ -14,10 +14,14 @@ namespace AlicizaX.Resource.Runtime
private class LoadingState : IMemory
{
public CancellationTokenSource Cts { get; set; }
+ public CancellationTokenRegistration Registration { get; set; }
public string Location { get; set; }
public void Clear()
{
+ Registration.Dispose();
+ Registration = default;
+
if (Cts != null)
{
Cts.Cancel();
@@ -25,7 +29,7 @@ namespace AlicizaX.Resource.Runtime
Cts = null;
}
- Location = String.Empty;
+ Location = string.Empty;
}
}
@@ -43,35 +47,26 @@ namespace AlicizaX.Resource.Runtime
{
return;
}
+
UnityEngine.Object assetObject = asset as UnityEngine.Object;
-
- if (assetObject != null)
+ if (assetObject == null)
{
- // 检查资源是否仍然是当前需要的。
- if (IsCurrentLocation(setAssetObject.TargetObject, setAssetObject.Location))
- {
- ClearLoadingState(setAssetObject.TargetObject);
+ Log.Error($"Load failure asset type is {asset?.GetType()}.");
+ return;
+ }
- SetAsset(setAssetObject, TrackLoadedAsset(setAssetObject.Location, assetObject));
- }
- else
- {
- // 资源已经过期,卸载。
- _resourceModule.UnloadAsset(assetObject);
- }
+ if (IsCurrentLocation(setAssetObject.TargetObject, setAssetObject.Location))
+ {
+ ClearLoadingState(setAssetObject.TargetObject);
+ SetAsset(setAssetObject, TrackLoadedAsset(setAssetObject.Location, assetObject));
}
else
{
- Log.Error($"Load failure asset type is {asset?.GetType()}.");
+ _resourceModule.UnloadAsset(assetObject);
}
}
- ///
- /// 通过Unity对象加载资源。
- ///
- /// ISetAssetObject。
- /// Unity对象类型。
- public async UniTaskVoid SetAssetByResources(ISetAssetObject setAssetObject,CancellationToken cancellationToken) where T : UnityEngine.Object
+ public async UniTaskVoid SetAssetByResources(ISetAssetObject setAssetObject, CancellationToken cancellationToken) where T : UnityEngine.Object
{
var target = setAssetObject.TargetObject;
var location = setAssetObject.Location;
@@ -81,27 +76,29 @@ namespace AlicizaX.Resource.Runtime
return;
}
- // 取消并清理旧的加载请求。
CancelAndCleanupOldRequest(target);
- // 创建新的加载状态
- var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
+ var linkedTokenSource = new CancellationTokenSource();
var loadingState = MemoryPool.Acquire();
loadingState.Cts = linkedTokenSource;
+ if (cancellationToken.CanBeCanceled)
+ {
+ loadingState.Registration = cancellationToken.Register(static state =>
+ {
+ ((CancellationTokenSource)state).Cancel();
+ }, linkedTokenSource);
+ }
+
loadingState.Location = location;
_loadingStates[target] = loadingState;
try
{
- // 等待其他可能正在进行的加载。
-
- // 再次检查是否被新请求替换。
if (!IsCurrentLocation(target, location))
{
return;
}
- // 检查缓存。
if (_assetItemPool.CanSpawn(location))
{
ClearLoadingState(target);
@@ -110,36 +107,24 @@ namespace AlicizaX.Resource.Runtime
SetAsset(setAssetObject, assetObject);
return;
}
- else
+
+ if (!IsCurrentLocation(target, location))
{
- // 最后一次检查是否被替换。
- if (!IsCurrentLocation(target, location))
- {
- return;
- }
-
- // 防止重复加载同一资源。
- if (!IsCurrentLocation(target, location))
- {
- // 已经在加载中,等待回调处理。
- return;
- }
-
- T resource = await _resourceModule.LoadAssetAsync(location, linkedTokenSource.Token);
- if (resource == null)
- {
- ClearLoadingState(target);
- return;
- }
-
- OnLoadAssetSuccess(location, resource, 0f, setAssetObject);
return;
}
+
+ T resource = await _resourceModule.LoadAssetAsync(location, linkedTokenSource.Token);
+ if (resource == null)
+ {
+ ClearLoadingState(target);
+ return;
+ }
+
+ OnLoadAssetSuccess(location, resource, 0f, setAssetObject);
}
catch (OperationCanceledException)
{
ClearLoadingState(target);
- // 请求被取消,正常情况,无需处理。
}
catch (Exception ex)
{
@@ -148,10 +133,6 @@ namespace AlicizaX.Resource.Runtime
}
}
- ///
- /// 取消并清理旧的加载请求。
- /// Unity对象。
- ///
private void CancelAndCleanupOldRequest(UnityEngine.Object target)
{
if (_loadingStates.TryGetValue(target, out var oldState))
@@ -161,10 +142,6 @@ namespace AlicizaX.Resource.Runtime
}
}
- ///
- /// 清理加载状态。
- /// Unity对象。
- ///
private void ClearLoadingState(UnityEngine.Object target)
{
if (_loadingStates.TryGetValue(target, out var state))
@@ -174,15 +151,13 @@ namespace AlicizaX.Resource.Runtime
}
}
- ///
- /// 检查指定位置是否仍是该目标的当前加载位置。
- ///
private bool IsCurrentLocation(UnityEngine.Object target, string location)
{
if (target == null)
{
return false;
}
+
return _loadingStates.TryGetValue(target, out var state) && state.Location == location;
}
@@ -199,11 +174,10 @@ namespace AlicizaX.Resource.Runtime
return assetObject;
}
- ///
- /// 组件销毁时清理所有资源。
- ///
private void OnDestroy()
{
+ ReleaseTrackedAssets();
+
foreach (var state in _loadingStates.Values)
{
MemoryPool.Release(state);
@@ -212,4 +186,4 @@ namespace AlicizaX.Resource.Runtime
_loadingStates.Clear();
}
}
-}
+}
\ No newline at end of file
diff --git a/Runtime/Resource/Resource/Extension/ResourceExtComponent.cs b/Runtime/Resource/Resource/Extension/ResourceExtComponent.cs
index 21518f7..9bb225c 100644
--- a/Runtime/Resource/Resource/Extension/ResourceExtComponent.cs
+++ b/Runtime/Resource/Resource/Extension/ResourceExtComponent.cs
@@ -47,6 +47,8 @@ namespace AlicizaX.Resource.Runtime
///
private LinkedList _loadAssetObjectsLinkedList;
+ private Dictionary