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

View File

@@ -1,4 +1,6 @@

using System.Collections;
using System.Collections.Generic;
namespace YooAsset
{
internal interface IBundleQuery
@@ -11,21 +13,11 @@ namespace YooAsset
/// <summary>
/// 获取依赖的资源包信息集合
/// </summary>
BundleInfo[] GetDependBundleInfos(AssetInfo assetPath);
List<BundleInfo> GetDependBundleInfos(AssetInfo assetPath);
/// <summary>
/// 获取主资源包名称
/// </summary>
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.IO;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
@@ -171,10 +170,10 @@ namespace YooAsset
}
/// <summary>
/// 获取依赖列表
/// 获取资源对象的依赖列表(框架层查询结果)
/// 注意:传入的资源对象一定合法有效!
/// </summary>
public PackageBundle[] GetAllDependencies(PackageAsset packageAsset)
public List<PackageBundle> GetAssetAllDependencies(PackageAsset packageAsset)
{
List<PackageBundle> result = new List<PackageBundle>(packageAsset.DependBundleIDs.Length);
foreach (var dependID in packageAsset.DependBundleIDs)
@@ -182,14 +181,14 @@ namespace YooAsset
var dependBundle = GetMainPackageBundle(dependID);
result.Add(dependBundle);
}
return result.ToArray();
return result;
}
/// <summary>
/// 获取依赖列表
/// 获取资源包的依赖列表(引擎层查询结果)
/// 注意:传入的资源包对象一定合法有效!
/// </summary>
public PackageBundle[] GetAllDependencies(PackageBundle packageBundle)
public List<PackageBundle> GetBundleAllDependencies(PackageBundle packageBundle)
{
List<PackageBundle> result = new List<PackageBundle>(packageBundle.DependBundleIDs.Length);
foreach (var dependID in packageBundle.DependBundleIDs)
@@ -197,7 +196,7 @@ namespace YooAsset
var dependBundle = GetMainPackageBundle(dependID);
result.Add(dependBundle);
}
return result.ToArray();
return result;
}
/// <summary>
@@ -211,17 +210,17 @@ namespace YooAsset
/// <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>
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>
@@ -245,13 +244,14 @@ namespace YooAsset
/// </summary>
public AssetInfo[] GetAllAssetInfos()
{
List<AssetInfo> result = new List<AssetInfo>(AssetList.Count);
foreach (var packageAsset in AssetList)
AssetInfo[] result = new AssetInfo[AssetList.Count];
for (int i = 0; i < AssetList.Count; i++)
{
var packageAsset = AssetList[i];
AssetInfo assetInfo = new AssetInfo(PackageName, packageAsset, null);
result.Add(assetInfo);
result[i] = assetInfo;
}
return result.ToArray();
return result;
}
/// <summary>
@@ -259,7 +259,7 @@ namespace YooAsset
/// </summary>
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)
{
if (packageAsset.HasTag(tags))

View File

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

View File

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