From 0bde506aec14dcdbb103d84e24baee078bb150a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Thu, 9 Oct 2025 19:10:26 +0800 Subject: [PATCH] feat #648 --- Assets/YooAsset/Runtime/InitializeParameters.cs | 5 +++++ .../Runtime/ResourceManager/Handle/HandleBase.cs | 9 +++++++-- .../ResourceManager/Provider/ProviderOperation.cs | 11 +++++++++++ .../Runtime/ResourceManager/ResourceManager.cs | 2 ++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Assets/YooAsset/Runtime/InitializeParameters.cs b/Assets/YooAsset/Runtime/InitializeParameters.cs index 058330d1..b3ef0b09 100644 --- a/Assets/YooAsset/Runtime/InitializeParameters.cs +++ b/Assets/YooAsset/Runtime/InitializeParameters.cs @@ -43,6 +43,11 @@ namespace YooAsset /// public int BundleLoadingMaxConcurrency = int.MaxValue; + /// + /// 当资源引用计数为零的时候自动释放资源包 + /// + public bool AutoUnloadBundleWhenUnused = false; + /// /// WebGL平台强制同步加载资源对象 /// diff --git a/Assets/YooAsset/Runtime/ResourceManager/Handle/HandleBase.cs b/Assets/YooAsset/Runtime/ResourceManager/Handle/HandleBase.cs index 5c3fb267..26100cb5 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Handle/HandleBase.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Handle/HandleBase.cs @@ -23,6 +23,11 @@ namespace YooAsset if (IsValidWithWarning == false) return; Provider.ReleaseHandle(this); + + // 主动卸载零引用的资源包 + if (Provider.RefCount == 0) + Provider.TryUnloadBundle(); + Provider = null; } @@ -146,11 +151,11 @@ namespace YooAsset /// public System.Threading.Tasks.Task Task { - get + get { if (IsValidWithWarning == false) return null; - return Provider.Task; + return Provider.Task; } } diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs index 02e63576..462eaeff 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs @@ -308,6 +308,17 @@ namespace YooAsset } } + /// + /// 尝试卸载资源包 + /// + public void TryUnloadBundle() + { + if (_resManager.AutoUnloadBundleWhenUnused) + { + _resManager.TryUnloadUnusedAsset(MainAssetInfo, 10); + } + } + /// /// 结束流程 /// diff --git a/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs b/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs index baeb02c1..9eae02af 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs @@ -17,6 +17,7 @@ namespace YooAsset private int _bundleLoadingMaxConcurrency; // 开发者配置选项 + public bool AutoUnloadBundleWhenUnused { private set; get; } public bool WebGLForceSyncLoadAsset { private set; get; } public bool UseWeakReferenceHandle { private set; get; } @@ -47,6 +48,7 @@ namespace YooAsset public void Initialize(InitializeParameters parameters, IBundleQuery bundleServices) { _bundleLoadingMaxConcurrency = parameters.BundleLoadingMaxConcurrency; + AutoUnloadBundleWhenUnused = parameters.AutoUnloadBundleWhenUnused; WebGLForceSyncLoadAsset = parameters.WebGLForceSyncLoadAsset; UseWeakReferenceHandle = parameters.UseWeakReferenceHandle; _bundleQuery = bundleServices;