优化不必要的GC
This commit is contained in:
何冠峰
2025-07-23 11:07:29 +08:00
parent 33907ea967
commit 268792b576
5 changed files with 42 additions and 69 deletions

View File

@@ -62,6 +62,11 @@ namespace YooAsset
/// </summary> /// </summary>
public void TryUnloadUnusedAsset(AssetInfo assetInfo, int loopCount) public void TryUnloadUnusedAsset(AssetInfo assetInfo, int loopCount)
{ {
if (assetInfo == null)
{
YooLogger.Error($"{nameof(AssetInfo)} is null !");
return;
}
if (assetInfo.IsInvalid) if (assetInfo.IsInvalid)
{ {
YooLogger.Error($"Failed to unload asset ! {assetInfo.Error}"); YooLogger.Error($"Failed to unload asset ! {assetInfo.Error}");
@@ -73,31 +78,29 @@ namespace YooAsset
loopCount--; loopCount--;
// 卸载主资源包加载器 // 卸载主资源包加载器
string mainBundleName = _bundleQuery.GetMainBundleName(assetInfo); string mainBundleName = _bundleQuery.GetMainBundleName(assetInfo.Asset.BundleID);
var mainLoader = TryGetBundleFileLoader(mainBundleName); var mainLoader = TryGetBundleFileLoader(mainBundleName);
if (mainLoader != null) if (mainLoader != null)
{ {
mainLoader.TryDestroyProviders(); mainLoader.TryDestroyProviders();
if (mainLoader.CanDestroyLoader()) if (mainLoader.CanDestroyLoader())
{ {
string bundleName = mainLoader.LoadBundleInfo.Bundle.BundleName;
mainLoader.DestroyLoader(); mainLoader.DestroyLoader();
LoaderDic.Remove(bundleName); LoaderDic.Remove(mainBundleName);
} }
} }
// 卸载依赖资源包加载器 // 卸载依赖资源包加载器
string[] dependBundleNames = _bundleQuery.GetDependBundleNames(assetInfo); foreach (var dependID in assetInfo.Asset.DependBundleIDs)
foreach (var dependBundleName in dependBundleNames)
{ {
string dependBundleName = _bundleQuery.GetMainBundleName(dependID);
var dependLoader = TryGetBundleFileLoader(dependBundleName); var dependLoader = TryGetBundleFileLoader(dependBundleName);
if (dependLoader != null) if (dependLoader != null)
{ {
if (dependLoader.CanDestroyLoader()) if (dependLoader.CanDestroyLoader())
{ {
string bundleName = dependLoader.LoadBundleInfo.Bundle.BundleName;
dependLoader.DestroyLoader(); dependLoader.DestroyLoader();
LoaderDic.Remove(bundleName); LoaderDic.Remove(dependBundleName);
} }
} }
} }
@@ -296,8 +299,8 @@ namespace YooAsset
} }
internal List<LoadBundleFileOperation> CreateDependBundleFileLoaders(AssetInfo assetInfo) internal List<LoadBundleFileOperation> CreateDependBundleFileLoaders(AssetInfo assetInfo)
{ {
BundleInfo[] bundleInfos = _bundleQuery.GetDependBundleInfos(assetInfo); List<BundleInfo> bundleInfos = _bundleQuery.GetDependBundleInfos(assetInfo);
List<LoadBundleFileOperation> result = new List<LoadBundleFileOperation>(bundleInfos.Length); List<LoadBundleFileOperation> result = new List<LoadBundleFileOperation>(bundleInfos.Count);
foreach (var bundleInfo in bundleInfos) foreach (var bundleInfo in bundleInfos)
{ {
var bundleLoader = CreateBundleFileLoaderInternal(bundleInfo); var bundleLoader = CreateBundleFileLoaderInternal(bundleInfo);

View File

@@ -1,4 +1,6 @@
 using System.Collections;
using System.Collections.Generic;
namespace YooAsset namespace YooAsset
{ {
internal interface IBundleQuery internal interface IBundleQuery
@@ -11,21 +13,11 @@ namespace YooAsset
/// <summary> /// <summary>
/// 获取依赖的资源包信息集合 /// 获取依赖的资源包信息集合
/// </summary> /// </summary>
BundleInfo[] GetDependBundleInfos(AssetInfo assetPath); List<BundleInfo> GetDependBundleInfos(AssetInfo assetPath);
/// <summary> /// <summary>
/// 获取主资源包名称 /// 获取主资源包名称
/// </summary> /// </summary>
string GetMainBundleName(int bundleID); string GetMainBundleName(int bundleID);
/// <summary>
/// 获取主资源包名称
/// </summary>
string GetMainBundleName(AssetInfo assetInfo);
/// <summary>
/// 获取依赖的资源包名称集合
/// </summary>
string[] GetDependBundleNames(AssetInfo assetInfo);
} }
} }

View File

@@ -1,5 +1,4 @@
using System; using System;
using System.IO;
using System.Diagnostics; using System.Diagnostics;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
@@ -171,10 +170,10 @@ namespace YooAsset
} }
/// <summary> /// <summary>
/// 获取依赖列表 /// 获取资源对象的依赖列表(框架层查询结果)
/// 注意:传入的资源对象一定合法有效! /// 注意:传入的资源对象一定合法有效!
/// </summary> /// </summary>
public PackageBundle[] GetAllDependencies(PackageAsset packageAsset) public List<PackageBundle> GetAssetAllDependencies(PackageAsset packageAsset)
{ {
List<PackageBundle> result = new List<PackageBundle>(packageAsset.DependBundleIDs.Length); List<PackageBundle> result = new List<PackageBundle>(packageAsset.DependBundleIDs.Length);
foreach (var dependID in packageAsset.DependBundleIDs) foreach (var dependID in packageAsset.DependBundleIDs)
@@ -182,14 +181,14 @@ namespace YooAsset
var dependBundle = GetMainPackageBundle(dependID); var dependBundle = GetMainPackageBundle(dependID);
result.Add(dependBundle); result.Add(dependBundle);
} }
return result.ToArray(); return result;
} }
/// <summary> /// <summary>
/// 获取依赖列表 /// 获取资源包的依赖列表(引擎层查询结果)
/// 注意:传入的资源包对象一定合法有效! /// 注意:传入的资源包对象一定合法有效!
/// </summary> /// </summary>
public PackageBundle[] GetAllDependencies(PackageBundle packageBundle) public List<PackageBundle> GetBundleAllDependencies(PackageBundle packageBundle)
{ {
List<PackageBundle> result = new List<PackageBundle>(packageBundle.DependBundleIDs.Length); List<PackageBundle> result = new List<PackageBundle>(packageBundle.DependBundleIDs.Length);
foreach (var dependID in packageBundle.DependBundleIDs) foreach (var dependID in packageBundle.DependBundleIDs)
@@ -197,7 +196,7 @@ namespace YooAsset
var dependBundle = GetMainPackageBundle(dependID); var dependBundle = GetMainPackageBundle(dependID);
result.Add(dependBundle); result.Add(dependBundle);
} }
return result.ToArray(); return result;
} }
/// <summary> /// <summary>
@@ -211,17 +210,17 @@ namespace YooAsset
/// <summary> /// <summary>
/// 尝试获取包裹的资源包 /// 尝试获取包裹的资源包
/// </summary> /// </summary>
public bool TryGetPackageBundleByBundleName(string bundleName, out PackageBundle result) public bool TryGetPackageBundleByFileName(string fileName, out PackageBundle result)
{ {
return BundleDic1.TryGetValue(bundleName, out result); return BundleDic2.TryGetValue(fileName, out result);
} }
/// <summary> /// <summary>
/// 尝试获取包裹的资源包 /// 尝试获取包裹的资源包
/// </summary> /// </summary>
public bool TryGetPackageBundleByFileName(string fileName, out PackageBundle result) public bool TryGetPackageBundleByBundleName(string bundleName, out PackageBundle result)
{ {
return BundleDic2.TryGetValue(fileName, out result); return BundleDic1.TryGetValue(bundleName, out result);
} }
/// <summary> /// <summary>
@@ -245,13 +244,14 @@ namespace YooAsset
/// </summary> /// </summary>
public AssetInfo[] GetAllAssetInfos() public AssetInfo[] GetAllAssetInfos()
{ {
List<AssetInfo> result = new List<AssetInfo>(AssetList.Count); AssetInfo[] result = new AssetInfo[AssetList.Count];
foreach (var packageAsset in AssetList) for (int i = 0; i < AssetList.Count; i++)
{ {
var packageAsset = AssetList[i];
AssetInfo assetInfo = new AssetInfo(PackageName, packageAsset, null); AssetInfo assetInfo = new AssetInfo(PackageName, packageAsset, null);
result.Add(assetInfo); result[i] = assetInfo;
} }
return result.ToArray(); return result;
} }
/// <summary> /// <summary>
@@ -259,7 +259,7 @@ namespace YooAsset
/// </summary> /// </summary>
public AssetInfo[] GetAssetInfosByTags(string[] tags) public AssetInfo[] GetAssetInfosByTags(string[] tags)
{ {
List<AssetInfo> result = new List<AssetInfo>(100); List<AssetInfo> result = new List<AssetInfo>(AssetList.Count);
foreach (var packageAsset in AssetList) foreach (var packageAsset in AssetList)
{ {
if (packageAsset.HasTag(tags)) if (packageAsset.HasTag(tags))

View File

@@ -176,30 +176,30 @@ namespace YooAsset
var packageBundle = ActiveManifest.GetMainPackageBundle(assetInfo.Asset); var packageBundle = ActiveManifest.GetMainPackageBundle(assetInfo.Asset);
return CreateBundleInfo(packageBundle); return CreateBundleInfo(packageBundle);
} }
BundleInfo[] IBundleQuery.GetDependBundleInfos(AssetInfo assetInfo) List<BundleInfo> IBundleQuery.GetDependBundleInfos(AssetInfo assetInfo)
{ {
if (assetInfo == null || assetInfo.IsInvalid) if (assetInfo == null || assetInfo.IsInvalid)
throw new Exception("Should never get here !"); throw new Exception("Should never get here !");
// 注意:如果清单里未找到资源包会抛出异常! // 注意:如果清单里未找到资源包会抛出异常!
PackageBundle[] depends; List<PackageBundle> depends;
if (assetInfo.LoadMethod == AssetInfo.ELoadMethod.LoadAllAssets) if (assetInfo.LoadMethod == AssetInfo.ELoadMethod.LoadAllAssets)
{ {
var mainBundle = ActiveManifest.GetMainPackageBundle(assetInfo.Asset); var mainBundle = ActiveManifest.GetMainPackageBundle(assetInfo.Asset);
depends = ActiveManifest.GetAllDependencies(mainBundle); depends = ActiveManifest.GetBundleAllDependencies(mainBundle);
} }
else else
{ {
depends = ActiveManifest.GetAllDependencies(assetInfo.Asset); depends = ActiveManifest.GetAssetAllDependencies(assetInfo.Asset);
} }
List<BundleInfo> result = new List<BundleInfo>(depends.Length); List<BundleInfo> result = new List<BundleInfo>(depends.Count);
foreach (var packageBundle in depends) foreach (var packageBundle in depends)
{ {
BundleInfo bundleInfo = CreateBundleInfo(packageBundle); BundleInfo bundleInfo = CreateBundleInfo(packageBundle);
result.Add(bundleInfo); result.Add(bundleInfo);
} }
return result.ToArray(); return result;
} }
string IBundleQuery.GetMainBundleName(int bundleID) string IBundleQuery.GetMainBundleName(int bundleID)
{ {
@@ -207,29 +207,6 @@ namespace YooAsset
var packageBundle = ActiveManifest.GetMainPackageBundle(bundleID); var packageBundle = ActiveManifest.GetMainPackageBundle(bundleID);
return packageBundle.BundleName; return packageBundle.BundleName;
} }
string IBundleQuery.GetMainBundleName(AssetInfo assetInfo)
{
if (assetInfo == null || assetInfo.IsInvalid)
throw new Exception("Should never get here !");
// 注意:如果清单里未找到资源包会抛出异常!
var packageBundle = ActiveManifest.GetMainPackageBundle(assetInfo.Asset);
return packageBundle.BundleName;
}
string[] IBundleQuery.GetDependBundleNames(AssetInfo assetInfo)
{
if (assetInfo == null || assetInfo.IsInvalid)
throw new Exception("Should never get here !");
// 注意:如果清单里未找到资源包会抛出异常!
var depends = ActiveManifest.GetAllDependencies(assetInfo.Asset);
List<string> result = new List<string>(depends.Length);
foreach (var packageBundle in depends)
{
result.Add(packageBundle.BundleName);
}
return result.ToArray();
}
#endregion #endregion
/// <summary> /// <summary>
@@ -336,7 +313,7 @@ namespace YooAsset
checkList.Add(mainBundle); checkList.Add(mainBundle);
// 注意:如果清单里未找到资源包会抛出异常! // 注意:如果清单里未找到资源包会抛出异常!
PackageBundle[] mainDependBundles = manifest.GetAllDependencies(assetInfo.Asset); List<PackageBundle> mainDependBundles = manifest.GetAssetAllDependencies(assetInfo.Asset);
foreach (var dependBundle in mainDependBundles) foreach (var dependBundle in mainDependBundles)
{ {
if (checkList.Contains(dependBundle) == false) if (checkList.Contains(dependBundle) == false)
@@ -352,7 +329,7 @@ namespace YooAsset
if (checkList.Contains(otherMainBundle) == false) if (checkList.Contains(otherMainBundle) == false)
checkList.Add(otherMainBundle); checkList.Add(otherMainBundle);
PackageBundle[] otherDependBundles = manifest.GetAllDependencies(otherMainAsset); List<PackageBundle> otherDependBundles = manifest.GetAssetAllDependencies(otherMainAsset);
foreach (var dependBundle in otherDependBundles) foreach (var dependBundle in otherDependBundles)
{ {
if (checkList.Contains(dependBundle) == false) if (checkList.Contains(dependBundle) == false)

View File

@@ -496,7 +496,7 @@ namespace YooAsset
if (bundleInfo.IsNeedDownloadFromRemote()) if (bundleInfo.IsNeedDownloadFromRemote())
return true; return true;
BundleInfo[] depends = _bundleQuery.GetDependBundleInfos(assetInfo); List<BundleInfo> depends = _bundleQuery.GetDependBundleInfos(assetInfo);
foreach (var depend in depends) foreach (var depend in depends)
{ {
if (depend.IsNeedDownloadFromRemote()) if (depend.IsNeedDownloadFromRemote())
@@ -555,6 +555,7 @@ namespace YooAsset
private RawFileHandle LoadRawFileInternal(AssetInfo assetInfo, bool waitForAsyncComplete, uint priority) private RawFileHandle LoadRawFileInternal(AssetInfo assetInfo, bool waitForAsyncComplete, uint priority)
{ {
assetInfo.LoadMethod = AssetInfo.ELoadMethod.LoadRawFile;
var handle = _resourceManager.LoadRawFileAsync(assetInfo, priority); var handle = _resourceManager.LoadRawFileAsync(assetInfo, priority);
if (waitForAsyncComplete) if (waitForAsyncComplete)
handle.WaitForAsyncComplete(); handle.WaitForAsyncComplete();