Resource增加自动释放

This commit is contained in:
陈思海 2025-11-17 16:49:25 +08:00
parent b6eaa0c3d0
commit f8f2ea0201
5 changed files with 59 additions and 34 deletions

View File

@ -32,6 +32,7 @@ namespace AlicizaX.Resource.Editor
private SerializedProperty _packageName = null; private SerializedProperty _packageName = null;
private SerializedProperty _decryptionServices = null; private SerializedProperty _decryptionServices = null;
private SerializedProperty _playMode = null; private SerializedProperty _playMode = null;
private SerializedProperty _autoUnloadBundleWhenUnused = null;
private int _packageNameIndex = 0; private int _packageNameIndex = 0;
private string[] _packageNames; private string[] _packageNames;
@ -101,6 +102,7 @@ namespace AlicizaX.Resource.Editor
} }
} }
EditorGUILayout.PropertyField(_autoUnloadBundleWhenUnused);
EditorGUILayout.PropertyField(_useSystemUnloadUnusedAssets); EditorGUILayout.PropertyField(_useSystemUnloadUnusedAssets);
float minUnloadUnusedAssetsInterval = float minUnloadUnusedAssetsInterval =
@ -245,8 +247,9 @@ namespace AlicizaX.Resource.Editor
_downloadingMaxNum = serializedObject.FindProperty("downloadingMaxNum"); _downloadingMaxNum = serializedObject.FindProperty("downloadingMaxNum");
_failedTryAgain = serializedObject.FindProperty("failedTryAgain"); _failedTryAgain = serializedObject.FindProperty("failedTryAgain");
_packageName = serializedObject.FindProperty("packageName"); _packageName = serializedObject.FindProperty("packageName");
_decryptionServices = serializedObject.FindProperty("_decryptionServices"); _decryptionServices = serializedObject.FindProperty("decryptionServices");
_playMode = serializedObject.FindProperty("_playMode"); _playMode = serializedObject.FindProperty("_playMode");
_autoUnloadBundleWhenUnused = serializedObject.FindProperty("autoUnloadBundleWhenUnused");
RefreshDecryptionServices(); RefreshDecryptionServices();
RefreshTypeNames(); RefreshTypeNames();
_playModeIndex = EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0); _playModeIndex = EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0);

View File

@ -29,6 +29,10 @@ namespace AlicizaX.Resource.Runtime
string DecryptionServices { get; set; } string DecryptionServices { get; set; }
/// <summary>
/// 自动释放资源引用计数为0的资源包
/// </summary>
bool AutoUnloadBundleWhenUnused { get; set; }
/// <summary> /// <summary>
/// 同时下载的最大数目。 /// 同时下载的最大数目。

View File

@ -34,7 +34,13 @@ namespace AlicizaX.Resource.Runtime
[SerializeField] private bool useSystemUnloadUnusedAssets = true; [SerializeField] private bool useSystemUnloadUnusedAssets = true;
[SerializeField] private string _decryptionServices = ""; [SerializeField] private string decryptionServices = "";
/// <summary>
/// 自动释放资源引用计数为0的资源包
/// </summary>
[SerializeField] public bool autoUnloadBundleWhenUnused = false;
[SerializeField] private EPlayMode _playMode = EPlayMode.EditorSimulateMode; [SerializeField] private EPlayMode _playMode = EPlayMode.EditorSimulateMode;
/// <summary> /// <summary>
@ -194,7 +200,8 @@ namespace AlicizaX.Resource.Runtime
_playMode = (EPlayMode)UnityEditor.EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0); _playMode = (EPlayMode)UnityEditor.EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0);
#endif #endif
_resourceModule.DefaultPackageName = PackageName; _resourceModule.DefaultPackageName = PackageName;
_resourceModule.DecryptionServices = _decryptionServices; _resourceModule.DecryptionServices = decryptionServices;
_resourceModule.AutoUnloadBundleWhenUnused = autoUnloadBundleWhenUnused;
_resourceModule.PlayMode = _playMode; _resourceModule.PlayMode = _playMode;
_resourceModule.Milliseconds = milliseconds; _resourceModule.Milliseconds = milliseconds;
_resourceModule.DownloadingMaxNum = DownloadingMaxNum; _resourceModule.DownloadingMaxNum = DownloadingMaxNum;

View File

@ -13,33 +13,39 @@ namespace AlicizaX.Resource.Runtime
private InitializationOperation CreateInitializationOperationHandler(ResourcePackage resourcePackage, string hostServerURL, string fallbackHostServerURL, string decryptionServicesName) private InitializationOperation CreateInitializationOperationHandler(ResourcePackage resourcePackage, string hostServerURL, string fallbackHostServerURL, string decryptionServicesName)
{ {
IDecryptionServices decryptionServices = CreateDecryptionServices(decryptionServicesName); IDecryptionServices decryptionServices = CreateDecryptionServices(decryptionServicesName);
InitializeParameters initializeParameters = null;
switch (PlayMode) switch (PlayMode)
{ {
case EPlayMode.EditorSimulateMode: case EPlayMode.EditorSimulateMode:
{ {
// 编辑器下的模拟模式 initializeParameters = InitializeYooAssetEditorSimulateMode(DefaultPackageName);
return InitializeYooAssetEditorSimulateMode(resourcePackage, DefaultPackageName); break;
} }
case EPlayMode.OfflinePlayMode: case EPlayMode.OfflinePlayMode:
{ {
// 单机运行模式 // 单机运行模式
return InitializeYooAssetOfflinePlayMode(resourcePackage, decryptionServices); initializeParameters = InitializeYooAssetOfflinePlayMode(decryptionServices);
break;
} }
case EPlayMode.HostPlayMode: case EPlayMode.HostPlayMode:
{ {
// 联机运行模式 // 联机运行模式
return InitializeYooAssetHostPlayMode(resourcePackage, hostServerURL, fallbackHostServerURL, decryptionServices); initializeParameters = InitializeYooAssetHostPlayMode(hostServerURL, fallbackHostServerURL, decryptionServices);
break;
} }
case EPlayMode.WebPlayMode: case EPlayMode.WebPlayMode:
{ {
// WebGL运行模式 // WebGL运行模式
return InitializeYooAssetWebPlayMode(resourcePackage, hostServerURL, fallbackHostServerURL); initializeParameters = InitializeYooAssetWebPlayMode(hostServerURL, fallbackHostServerURL);
} break;
default:
{
return null;
} }
} }
if (initializeParameters == null) return null;
initializeParameters.AutoUnloadBundleWhenUnused = AutoUnloadBundleWhenUnused;
return resourcePackage.InitializeAsync(initializeParameters);
} }
private IDecryptionServices CreateDecryptionServices(string decryptionServicesName) private IDecryptionServices CreateDecryptionServices(string decryptionServicesName)
@ -54,32 +60,30 @@ namespace AlicizaX.Resource.Runtime
return decryptionServices; return decryptionServices;
} }
private InitializationOperation InitializeYooAssetEditorSimulateMode(ResourcePackage resourcePackage, string packageName) private InitializeParameters InitializeYooAssetEditorSimulateMode(string packageName)
{ {
var buildResult = EditorSimulateModeHelper.SimulateBuild(packageName); var buildResult = EditorSimulateModeHelper.SimulateBuild(packageName);
var packageRoot = buildResult.PackageRootDirectory; var packageRoot = buildResult.PackageRootDirectory;
var createParameters = new EditorSimulateModeParameters(); var initializeParameters = new EditorSimulateModeParameters();
createParameters.EditorFileSystemParameters = FileSystemParameters.CreateDefaultEditorFileSystemParameters(packageRoot); initializeParameters.EditorFileSystemParameters = FileSystemParameters.CreateDefaultEditorFileSystemParameters(packageRoot);
// createParameters.EditorFileSystemParameters.AddParameter(FileSystemParametersDefine.DECRYPTION_SERVICES,new FileOffsetEncryption()); return initializeParameters;
return resourcePackage.InitializeAsync(createParameters);
} }
private InitializationOperation InitializeYooAssetOfflinePlayMode(ResourcePackage resourcePackage, IDecryptionServices decryptionServices = null) private InitializeParameters InitializeYooAssetOfflinePlayMode(IDecryptionServices decryptionServices = null)
{ {
var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(decryptionServices); var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(decryptionServices);
var initParameters = new OfflinePlayModeParameters(); var initializeParameters = new OfflinePlayModeParameters();
initParameters.BuildinFileSystemParameters = buildinFileSystem; initializeParameters.BuildinFileSystemParameters = buildinFileSystem;
return resourcePackage.InitializeAsync(initParameters); return initializeParameters;
} }
private InitializationOperation InitializeYooAssetWebPlayMode(ResourcePackage resourcePackage, string hostServerURL, string fallbackHostServerURL) private InitializeParameters InitializeYooAssetWebPlayMode(string hostServerURL, string fallbackHostServerURL)
{ {
var initParameters = new WebPlayModeParameters(); var initializeParameters = new WebPlayModeParameters();
FileSystemParameters webRemoteFileSystemParams = null; FileSystemParameters webRemoteFileSystemParams = null;
IRemoteServices remoteServices = new RemoteServices(hostServerURL, fallbackHostServerURL); IRemoteServices remoteServices = new RemoteServices(hostServerURL, fallbackHostServerURL);
var webServerFileSystemParams = FileSystemParameters.CreateDefaultWebServerFileSystemParameters(); var webServerFileSystemParams = FileSystemParameters.CreateDefaultWebServerFileSystemParameters();
#if UNITY_WEBGL #if UNITY_WEBGL
#if WEIXINMINIGAME #if WEIXINMINIGAME
@ -91,20 +95,20 @@ namespace AlicizaX.Resource.Runtime
#endif #endif
#endif #endif
initParameters.WebServerFileSystemParameters = webServerFileSystemParams; initializeParameters.WebServerFileSystemParameters = webServerFileSystemParams;
initParameters.WebRemoteFileSystemParameters = webRemoteFileSystemParams; initializeParameters.WebRemoteFileSystemParameters = webRemoteFileSystemParams;
return resourcePackage.InitializeAsync(initParameters); return initializeParameters;
} }
private InitializationOperation InitializeYooAssetHostPlayMode(ResourcePackage resourcePackage, string hostServerURL, string fallbackHostServerURL, IDecryptionServices decryptionServices = null) private InitializeParameters InitializeYooAssetHostPlayMode(string hostServerURL, string fallbackHostServerURL, IDecryptionServices decryptionServices = null)
{ {
IRemoteServices remoteServices = new RemoteServices(hostServerURL, fallbackHostServerURL); IRemoteServices remoteServices = new RemoteServices(hostServerURL, fallbackHostServerURL);
var cacheFileSystem = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); var cacheFileSystem = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices);
var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(decryptionServices); var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(decryptionServices);
var initParameters = new HostPlayModeParameters(); var initializeParameters = new HostPlayModeParameters();
initParameters.BuildinFileSystemParameters = buildinFileSystem; initializeParameters.BuildinFileSystemParameters = buildinFileSystem;
initParameters.CacheFileSystemParameters = cacheFileSystem; initializeParameters.CacheFileSystemParameters = cacheFileSystem;
return resourcePackage.InitializeAsync(initParameters); return initializeParameters;
} }
} }
} }

View File

@ -27,6 +27,11 @@ namespace AlicizaX.Resource.Runtime
public string DecryptionServices { get; set; } public string DecryptionServices { get; set; }
/// <summary>
/// 自动释放资源引用计数为0的资源包
/// </summary>
public bool AutoUnloadBundleWhenUnused { get; set; } = false;
/// <summary> /// <summary>
/// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒) /// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒)
/// </summary> /// </summary>
@ -807,6 +812,7 @@ namespace AlicizaX.Resource.Runtime
{ {
loadAssetCallbacks.LoadAssetFailureCallback(location, LoadResourceStatus.NotExist, errorMessage, userData); loadAssetCallbacks.LoadAssetFailureCallback(location, LoadResourceStatus.NotExist, errorMessage, userData);
} }
return; return;
} }
@ -908,6 +914,7 @@ namespace AlicizaX.Resource.Runtime
{ {
loadAssetCallbacks.LoadAssetFailureCallback(location, LoadResourceStatus.NotExist, errorMessage, userData); loadAssetCallbacks.LoadAssetFailureCallback(location, LoadResourceStatus.NotExist, errorMessage, userData);
} }
return; return;
} }