Skip to content

Commit

Permalink
Fixed tuyoogame#26
Browse files Browse the repository at this point in the history
修复多个场景打进一个AB包时,卸载子场景时抛出异常。
  • Loading branch information
gmhevinci committed Jul 20, 2022
1 parent d5a4b33 commit d64b31f
Show file tree
Hide file tree
Showing 12 changed files with 36 additions and 47 deletions.
51 changes: 17 additions & 34 deletions Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ internal static class AssetSystem
private static readonly List<AssetBundleLoaderBase> _loaders = new List<AssetBundleLoaderBase>(1000);
private static readonly List<ProviderBase> _providers = new List<ProviderBase>(1000);
private static readonly Dictionary<string, SceneOperationHandle> _sceneHandles = new Dictionary<string, SceneOperationHandle>(100);

private static long _sceneCreateCount = 0;

private static bool _simulationOnEditor;
private static int _loadingMaxNumber;
public static IDecryptionServices DecryptionServices { private set; get; }
Expand Down Expand Up @@ -144,24 +145,20 @@ public static SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadScene
return completedProvider.CreateHandle<SceneOperationHandle>();
}

// 注意:场景句柄永远保持唯一
string providerGUID = assetInfo.ProviderGUID;
if (_sceneHandles.ContainsKey(providerGUID))
return _sceneHandles[providerGUID];

// 如果加载的是主场景,则卸载所有缓存的场景
if (sceneMode == LoadSceneMode.Single)
{
UnloadAllScene();
}

ProviderBase provider = TryGetProvider(providerGUID);
if (provider == null)
// 注意:同一个场景的ProviderGUID每次加载都会变化
string providerGUID = $"{assetInfo.GUID}-{++_sceneCreateCount}";
ProviderBase provider;
{
if (_simulationOnEditor)
provider = new DatabaseSceneProvider(assetInfo, sceneMode, activateOnLoad, priority);
provider = new DatabaseSceneProvider(providerGUID, assetInfo, sceneMode, activateOnLoad, priority);
else
provider = new BundledSceneProvider(assetInfo, sceneMode, activateOnLoad, priority);
provider = new BundledSceneProvider(providerGUID, assetInfo, sceneMode, activateOnLoad, priority);
provider.InitSpawnDebugInfo();
_providers.Add(provider);
}
Expand All @@ -183,13 +180,14 @@ public static AssetOperationHandle LoadAssetAsync(AssetInfo assetInfo)
return completedProvider.CreateHandle<AssetOperationHandle>();
}

ProviderBase provider = TryGetProvider(assetInfo.ProviderGUID);
string providerGUID = assetInfo.GUID;
ProviderBase provider = TryGetProvider(providerGUID);
if (provider == null)
{
if (_simulationOnEditor)
provider = new DatabaseAssetProvider(assetInfo);
provider = new DatabaseAssetProvider(providerGUID, assetInfo);
else
provider = new BundledAssetProvider(assetInfo);
provider = new BundledAssetProvider(providerGUID, assetInfo);
provider.InitSpawnDebugInfo();
_providers.Add(provider);
}
Expand All @@ -208,13 +206,14 @@ public static SubAssetsOperationHandle LoadSubAssetsAsync(AssetInfo assetInfo)
return completedProvider.CreateHandle<SubAssetsOperationHandle>();
}

ProviderBase provider = TryGetProvider(assetInfo.ProviderGUID);
string providerGUID = assetInfo.GUID;
ProviderBase provider = TryGetProvider(providerGUID);
if (provider == null)
{
if (_simulationOnEditor)
provider = new DatabaseSubAssetsProvider(assetInfo);
provider = new DatabaseSubAssetsProvider(providerGUID, assetInfo);
else
provider = new BundledSubAssetsProvider(assetInfo);
provider = new BundledSubAssetsProvider(providerGUID, assetInfo);
provider.InitSpawnDebugInfo();
_providers.Add(provider);
}
Expand All @@ -223,7 +222,7 @@ public static SubAssetsOperationHandle LoadSubAssetsAsync(AssetInfo assetInfo)

internal static void UnloadSubScene(ProviderBase provider)
{
string providerGUID = provider.MainAssetInfo.ProviderGUID;
string providerGUID = provider.ProviderGUID;
if (_sceneHandles.ContainsKey(providerGUID) == false)
throw new Exception("Should never get here !");

Expand All @@ -233,12 +232,6 @@ internal static void UnloadSubScene(ProviderBase provider)

// 卸载未被使用的资源(包括场景)
AssetSystem.UnloadUnusedAssets();

// 检验子场景是否销毁
if (provider.IsDestroyed == false)
{
throw new Exception("Should never get here !");
}
}
internal static void UnloadAllScene()
{
Expand All @@ -251,16 +244,6 @@ internal static void UnloadAllScene()

// 卸载未被使用的资源(包括场景)
AssetSystem.UnloadUnusedAssets();

// 检验所有场景是否销毁
foreach (var provider in _providers)
{
if (provider.IsSceneProvider())
{
if (provider.IsDestroyed == false)
throw new Exception("Should never get here !");
}
}
}

internal static AssetBundleLoaderBase CreateOwnerAssetBundleLoader(AssetInfo assetInfo)
Expand Down Expand Up @@ -324,7 +307,7 @@ private static ProviderBase TryGetProvider(string providerGUID)
for (int i = 0; i < _providers.Count; i++)
{
ProviderBase temp = _providers[i];
if (temp.MainAssetInfo.ProviderGUID.Equals(providerGUID))
if (temp.ProviderGUID.Equals(providerGUID))
{
provider = temp;
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,14 @@ public void TryDestroyAllProviders()
if (IsDone() == false)
return;

// 注意:必须等待所有Provider可以销毁的时候,才可以释放Bundle文件。
// 条件1:必须等待所有Provider可以销毁
foreach (var provider in _providers)
{
if (provider.CanDestroy() == false)
return;
}

// 除了自己没有其它引用
// 条件2:除了自己没有其它引用
if (RefCount > _providers.Count)
return;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public override float Progress
}
}

public BundledAssetProvider(AssetInfo assetInfo) : base(assetInfo)
public BundledAssetProvider(string providerGUID, AssetInfo assetInfo) : base(providerGUID, assetInfo)
{
}
public override void Update()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal abstract class BundledProvider : ProviderBase
protected AssetBundleLoaderBase OwnerBundle { private set; get; }
protected DependAssetBundleGroup DependBundleGroup { private set; get; }

public BundledProvider(AssetInfo assetInfo) : base(assetInfo)
public BundledProvider(string providerGUID, AssetInfo assetInfo) : base(providerGUID, assetInfo)
{
OwnerBundle = AssetSystem.CreateOwnerAssetBundleLoader(assetInfo);
OwnerBundle.Reference();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public override float Progress
}
}

public BundledSceneProvider(AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad, int priority) : base(assetInfo)
public BundledSceneProvider(string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad, int priority) : base(providerGUID, assetInfo)
{
SceneMode = sceneMode;
_sceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public override float Progress
}
}

public BundledSubAssetsProvider(AssetInfo assetInfo) : base(assetInfo)
public BundledSubAssetsProvider(string providerGUID, AssetInfo assetInfo) : base(providerGUID, assetInfo)
{
}
public override void Update()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public override float Progress
}
}

public CompletedProvider(AssetInfo assetInfo) : base(assetInfo)
public CompletedProvider(AssetInfo assetInfo) : base(string.Empty, assetInfo)
{
}
public override void Update()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public override float Progress
}
}

public DatabaseAssetProvider(AssetInfo assetInfo) : base(assetInfo)
public DatabaseAssetProvider(string providerGUID, AssetInfo assetInfo) : base(providerGUID, assetInfo)
{
}
public override void Update()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public override float Progress
}
}

public DatabaseSceneProvider(AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad, int priority) : base(assetInfo)
public DatabaseSceneProvider(string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad, int priority) : base(providerGUID, assetInfo)
{
SceneMode = sceneMode;
_activateOnLoad = activateOnLoad;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public override float Progress
}
}

public DatabaseSubAssetsProvider(AssetInfo assetInfo) : base(assetInfo)
public DatabaseSubAssetsProvider(string providerGUID, AssetInfo assetInfo) : base(providerGUID, assetInfo)
{
}
public override void Update()
Expand Down
8 changes: 7 additions & 1 deletion Assets/YooAsset/Runtime/AssetSystem/Provider/ProviderBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ public enum EStatus
Fail,
}

/// <summary>
/// 资源提供者唯一标识符
/// </summary>
public string ProviderGUID { private set; get; }

/// <summary>
/// 资源信息
/// </summary>
Expand Down Expand Up @@ -85,8 +90,9 @@ public virtual float Progress
private readonly List<OperationHandleBase> _handles = new List<OperationHandleBase>();


public ProviderBase(AssetInfo assetInfo)
public ProviderBase(string providerGUID, AssetInfo assetInfo)
{
ProviderGUID = providerGUID;
MainAssetInfo = assetInfo;
}

Expand Down
4 changes: 2 additions & 2 deletions Assets/YooAsset/Runtime/PatchSystem/AssetInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ public class AssetInfo
private string _providerGUID;

/// <summary>
/// 资源提供者唯一标识符
/// 唯一标识符
/// </summary>
internal string ProviderGUID
internal string GUID
{
get
{
Expand Down

0 comments on commit d64b31f

Please sign in to comment.