refactor : 重构代码

This commit is contained in:
何冠峰
2026-01-17 18:44:48 +08:00
parent e10888de93
commit 0a1c81faf1
75 changed files with 219 additions and 197 deletions
@@ -7,18 +7,24 @@ using UnityEngine.SceneManagement;
namespace YooAsset
{
/// <summary>
/// 资源管理器
/// 注意:此类不是线程安全的,所有方法必须在Unity主线程调用
/// </summary>
internal class ResourceManager
{
internal readonly Dictionary<string, ProviderOperation> ProviderDic = new Dictionary<string, ProviderOperation>(5000);
internal readonly Dictionary<string, LoadBundleOperation> LoaderDic = new Dictionary<string, LoadBundleOperation>(5000);
internal readonly List<SceneHandle> SceneHandles = new List<SceneHandle>(100);
private readonly List<SceneHandle> _tempSceneHandles = new List<SceneHandle>(100);
private FileSystemHost _fileSystemHost;
private long _sceneCreateIndex = 0;
private int _bundleLoadingMaxConcurrency;
private int _bundleLoadingCounter;
private long _sceneCreateIndex;
// 开发者配置选项
public bool AutoUnloadBundleWhenUnused { private set; get; }
public bool WebGLForceSyncLoadAsset { private set; get; }
public bool AutoUnloadBundleWhenUnused { get; private set; }
public bool WebGLForceSyncLoadAsset { get; private set; }
/// <summary>
/// 所属包裹
@@ -30,12 +36,6 @@ namespace YooAsset
/// </summary>
public bool LockLoadOperation = false;
/// <summary>
/// 统计正在加载的Bundle文件数量
/// </summary>
public int BundleLoadingCounter = 0;
public ResourceManager(string packageName)
{
PackageName = packageName;
@@ -68,18 +68,21 @@ namespace YooAsset
{
if (assetInfo == null)
{
YooLogger.Error($"{nameof(AssetInfo)} is null !");
YooLogger.Error($"{nameof(AssetInfo)} is null.");
return;
}
if (assetInfo.IsInvalid)
{
YooLogger.Error($"Failed to unload asset ! {assetInfo.Error}");
YooLogger.Error($"Failed to unload asset. Error: {assetInfo.Error}");
return;
}
// 多次循环尝试卸载,以处理复杂的依赖链
// 例如:A依赖B,B依赖C,需要多次循环才能完全卸载
while (loopCount > 0)
{
loopCount--;
bool hasUnloaded = false;
// 卸载主资源包加载器
string mainBundleName = _fileSystemHost.GetMainBundleName(assetInfo.Asset.BundleID);
@@ -91,6 +94,7 @@ namespace YooAsset
{
mainLoader.DestroyLoader();
LoaderDic.Remove(mainBundleName);
hasUnloaded = true;
}
}
@@ -105,9 +109,14 @@ namespace YooAsset
{
dependLoader.DestroyLoader();
LoaderDic.Remove(dependBundleName);
hasUnloaded = true;
}
}
}
// 如果本次循环没有卸载任何资源,提前退出
if (hasUnloaded == false)
break;
}
}
@@ -120,7 +129,7 @@ namespace YooAsset
{
if (LockLoadOperation)
{
string error = $"The load operation locked !";
string error = $"The load operation locked.";
YooLogger.Error(error);
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(error);
@@ -129,7 +138,7 @@ namespace YooAsset
if (assetInfo.IsInvalid)
{
YooLogger.Error($"Failed to load scene ! {assetInfo.Error}");
YooLogger.Error($"Failed to load scene. Error: {assetInfo.Error}");
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(assetInfo.Error);
return completedProvider.CreateHandle<SceneHandle>();
@@ -159,7 +168,7 @@ namespace YooAsset
{
if (LockLoadOperation)
{
string error = $"The load operation locked !";
string error = $"The load operation locked.";
YooLogger.Error(error);
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(error);
@@ -168,7 +177,7 @@ namespace YooAsset
if (assetInfo.IsInvalid)
{
YooLogger.Error($"Failed to load asset ! {assetInfo.Error}");
YooLogger.Error($"Failed to load asset. Error: {assetInfo.Error}");
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(assetInfo.Error);
return completedProvider.CreateHandle<AssetHandle>();
@@ -195,7 +204,7 @@ namespace YooAsset
{
if (LockLoadOperation)
{
string error = $"The load operation locked !";
string error = $"The load operation locked.";
YooLogger.Error(error);
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(error);
@@ -204,7 +213,7 @@ namespace YooAsset
if (assetInfo.IsInvalid)
{
YooLogger.Error($"Failed to load sub assets ! {assetInfo.Error}");
YooLogger.Error($"Failed to load sub assets. Error: {assetInfo.Error}");
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(assetInfo.Error);
return completedProvider.CreateHandle<SubAssetsHandle>();
@@ -231,7 +240,7 @@ namespace YooAsset
{
if (LockLoadOperation)
{
string error = $"The load operation locked !";
string error = $"The load operation locked.";
YooLogger.Error(error);
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(error);
@@ -240,7 +249,7 @@ namespace YooAsset
if (assetInfo.IsInvalid)
{
YooLogger.Error($"Failed to load all assets ! {assetInfo.Error}");
YooLogger.Error($"Failed to load all assets. Error: {assetInfo.Error}");
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(assetInfo.Error);
return completedProvider.CreateHandle<AllAssetsHandle>();
@@ -267,7 +276,7 @@ namespace YooAsset
{
if (LockLoadOperation)
{
string error = $"The load operation locked !";
string error = $"The load operation locked.";
YooLogger.Error(error);
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(error);
@@ -276,7 +285,7 @@ namespace YooAsset
if (assetInfo.IsInvalid)
{
YooLogger.Error($"Failed to load raw file ! {assetInfo.Error}");
YooLogger.Error($"Failed to load raw file. Error: {assetInfo.Error}");
CompletedProvider completedProvider = new CompletedProvider(this, assetInfo);
completedProvider.SetCompletedWithError(assetInfo.Error);
return completedProvider.CreateHandle<RawFileHandle>();
@@ -339,9 +348,26 @@ namespace YooAsset
{
return LoaderDic.Count > 0;
}
internal void IncrementBundleLoadingCounter()
{
_bundleLoadingCounter++;
}
internal void DecrementBundleLoadingCounter()
{
_bundleLoadingCounter--;
if (_bundleLoadingCounter < 0)
{
YooLogger.Error("BundleLoadingCounter is negative.");
_bundleLoadingCounter = 0;
}
}
internal int GetBundleLoadingCounter()
{
return _bundleLoadingCounter;
}
internal bool BundleLoadingIsBusy()
{
return BundleLoadingCounter >= _bundleLoadingMaxConcurrency;
return _bundleLoadingCounter >= _bundleLoadingMaxConcurrency;
}
private LoadBundleOperation CreateBundleFileLoaderInternal(BundleInfo bundleInfo)
@@ -373,7 +399,7 @@ namespace YooAsset
}
private void OnSceneUnloaded(Scene scene)
{
List<SceneHandle> removeList = new List<SceneHandle>();
_tempSceneHandles.Clear(); //复用列表
foreach (var sceneHandle in SceneHandles)
{
if (sceneHandle.IsValid)
@@ -381,11 +407,11 @@ namespace YooAsset
if (sceneHandle.SceneObject == scene)
{
sceneHandle.Release();
removeList.Add(sceneHandle);
_tempSceneHandles.Add(sceneHandle);
}
}
}
foreach (var sceneHandle in removeList)
foreach (var sceneHandle in _tempSceneHandles)
{
SceneHandles.Remove(sceneHandle);
}