refactor : 重构代码
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user