Add AutoReleaseGameObjectHandle initialize parameters

支持自动释放游戏对象句柄的功能。
This commit is contained in:
hevinci
2022-06-23 16:02:53 +08:00
parent 60f6483a86
commit 32148821a1
4 changed files with 108 additions and 10 deletions

View File

@@ -10,28 +10,31 @@ namespace YooAsset
{
private static readonly List<AssetBundleLoaderBase> _loaders = new List<AssetBundleLoaderBase>(1000);
private static readonly List<ProviderBase> _providers = new List<ProviderBase>(1000);
private static readonly HashSet<AssetOperationHandle> _trackGameObjectHandles = new HashSet<AssetOperationHandle>();
private static readonly Dictionary<string, SceneOperationHandle> _sceneHandles = new Dictionary<string, SceneOperationHandle>(100);
private static bool _simulationOnEditor;
private static int _loadingMaxNumber;
public static bool AutoReleaseGameObjectHandle { private set; get; }
public static IDecryptionServices DecryptionServices { private set; get; }
public static IBundleServices BundleServices { private set; get; }
/// <summary>
/// 初始化资源系统
/// 初始化
/// 注意在使用AssetSystem之前需要初始化
/// </summary>
public static void Initialize(bool simulationOnEditor, int loadingMaxNumber, IDecryptionServices decryptionServices, IBundleServices bundleServices)
public static void Initialize(bool simulationOnEditor, int loadingMaxNumber, bool autoReleaseGameObjectHandle, IDecryptionServices decryptionServices, IBundleServices bundleServices)
{
_simulationOnEditor = simulationOnEditor;
_loadingMaxNumber = loadingMaxNumber;
AutoReleaseGameObjectHandle = autoReleaseGameObjectHandle;
DecryptionServices = decryptionServices;
BundleServices = bundleServices;
}
/// <summary>
/// 轮询更新
/// 更新
/// </summary>
public static void Update()
{
@@ -81,6 +84,11 @@ namespace YooAsset
/// </summary>
public static void UnloadUnusedAssets()
{
if (AutoReleaseGameObjectHandle)
{
CheckAutoReleaseGameObjectHandle();
}
if (_simulationOnEditor)
{
for (int i = _providers.Count - 1; i >= 0; i--)
@@ -221,6 +229,29 @@ namespace YooAsset
return provider.CreateHandle<SubAssetsOperationHandle>();
}
/// <summary>
/// 添加自动释放的游戏对象句柄
/// </summary>
public static void AddAutoReleaseGameObjectHandle(AssetOperationHandle handle)
{
if (_trackGameObjectHandles.Contains(handle) == false)
_trackGameObjectHandles.Add(handle);
}
private static void CheckAutoReleaseGameObjectHandle()
{
List<AssetOperationHandle> removeList = new List<AssetOperationHandle>();
foreach (var trackHandle in _trackGameObjectHandles)
{
trackHandle.CheckAutoReleaseHandle();
if (trackHandle.IsValidNoWarning == false)
removeList.Add(trackHandle);
}
foreach (var removeHandle in removeList)
{
_trackGameObjectHandles.Remove(removeHandle);
}
}
internal static void UnloadSubScene(ProviderBase provider)
{
string providerGUID = provider.MainAssetInfo.ProviderGUID;