Search Issue Tracker

Fixed

Fixed in 1.8.1

Votes

5

Found in [Package]

1.7.8

Issue ID

UVSB-2417

Regression

No

Large amount of memory used in AOT Prebuild

Package: Visual Scripting

-

When Visual Scripting creates the AOT stubs during a build, it loads every asset in the game to check if the main object inherits from IAotStubbable. This results in huge memory usage in large projects (in our case, it often causes a crash on a PC with 64GB of RAM)
There's a trivial code fix which is that you can check the asset type *without* loading the asset.
In AssetUtility.cs, replace GetAllAssetsOfType<T> with this version:
{code:java}
public static IEnumerable<T> GetAllAssetsOfType<T>()
{
if (typeof(UnityObject).IsAssignableFrom(typeof(T)))
{
return AssetDatabase.FindAssets($"t:{typeof(T).Name}")
.Select(AssetDatabase.GUIDToAssetPath)
.Select(AssetDatabase.LoadMainAssetAtPath)
.OfType<T>();
}
else
{
// GetAllAssetPaths is undocumented and sometimes returns
// paths that are outside the assets folder, hence the where filter.
var result = AssetDatabase.GetAllAssetPaths()
.Where(p => p.StartsWith("Assets"))
.Where(p => typeof(T).IsAssignableFrom(AssetDatabase.GetMainAssetTypeAtPath(p)))
.Select(AssetDatabase.LoadMainAssetAtPath)
.OfType<T>();
EditorUtility.UnloadUnusedAssetsImmediate();
return result;
}
}
{code}
This both reduces the memory usage, and improves the performance.

  1. Resolution Note (fix version 1.8.1):

    Optimising AOT Prebuild by checking the type of assets without always loading it.

    Fixed in 1.9.0

Comments (1)

  1. PanthenEye

    Jul 05, 2023 17:24

    Can we please get at least one hotfix this year? This was found in 1.7.8, which released more than a year ago.

Add comment

Log in to post comment