We recently deployed Mutable for a project and encountered a massive slowdown in editor performance which we traced back to excessive loading originating from GetNodeGroupObjectNodeMappingImmersive. If we understand the logic here correctly, the system uses GetReferencers to gather all connected CustomizableObjects to ensure a root and its tree of COs are pulled in together. However, it uses an open FARFilter, limited only to the paths from the asset registry, rather than narrowing the filter to just UCustomizableObject. This can lead to any assets which contain a reference to a CO to be loaded, which we ran into after replacing actors in sequences with actors using COIs for appearances. We saw it loading sequences and even __ExternalActors__ assets which would spin up a WorldPartition level in the background. This led to a cascade of COs loading sequences loading other COs loading other sequences, until most of the game’s cinematics were loaded into memory, because we encountered one customizable object.
To fix this, we have inserted
if (!Filter.PackageNames.IsEmpty())
{
Filter.ClassPaths.Add(UCustomizableObject::StaticClass()->GetClassPathName());
}
after the loop over ArrayReferenceNames, which filters out TempAutosave referencers. This leads to the ArrayAssetData only being filled with objects which can be cast to UCustomizableObject and filters out all unrelated assets, saving us from loading sequences and external actors in other levels, as well as any blueprints which may hold a reference. Note that it’s important we only add this class filter if the PackageNames has elements, else the filter will flip to gathering all COs in the project, which leads to a far worse problem as the function then tries to load all COs everywhere, potentially heading for stackoverflow as it recurses through every CO n-squared times. Can save you some time making that mistake.
[Attachment Removed]