Mutable failing to load meshes during LOD updates.

We are currently upgrading our engine version to 5.6 from 5.5, and are running into an issue with Mutable where it seems to be failing to create the customized meshes.

The issue is presenting itself as our NPCs appearing as our default mesh, or with no textures loaded (tile pattern all over the skel mesh).

When setting `LogMutable` to VeryVerbose we only see the following lines spammed in our log, with the Instance ID continuing to grow.

[2025.07.21-12.20.27:200][856]LogTemp: Warning: LOD Update Candidate found: MUT_TP_Character (CustomizableObjectInstance_2147478728)
[2025.07.21-12.20.27:200][856]LogTemp: Warning:     Committed Descriptor: (Hash=1073981341,MinLODs=[(0, 1),])FirstLODAvailable=[(0, 0),])FirstRequestedLOD=[(0, 1),])
[2025.07.21-12.20.27:200][856]LogTemp: Warning:     Requested Descriptor: (Hash=1073981341,MinLODs=[(0, 1),])FirstLODAvailable=[(0, 0),])FirstRequestedLOD=[(0, 0),])
[2025.07.21-12.20.27:200][856]LogMutable: Warning: Instance texture reuse requires that the current Mutable state is in non-streaming mode. Change it in the Mutable graph base node in the state definition.
[2025.07.21-12.20.27:201][856]LogMutable: Verbose: Creating Mutable instance with id [237] 
[2025.07.21-12.20.27:237][859]LogMutable: Verbose: Finished Update Skeletal Mesh Async. CustomizableObject=MUT_TP_Character Instance=CustomizableObjectInstance_2147478728, Frame=13447  QueueTime=0.000000, UpdateTime=0.036614
[2025.07.21-12.20.27:248][860]LogTemp: Warning: Requested LOD Updates: 21
[2025.07.21-12.20.27:248][860]LogTemp: Warning:     Object: MUT_TP_Character
[2025.07.21-12.20.27:249][860]LogTemp: Warning:     Instance: CustomizableObjectInstance_2147478728
...
[2025.07.21-12.20.27:255][860]LogTemp: Warning: LOD Update Candidate found: MUT_TP_Character (CustomizableObjectInstance_2147478728)
[2025.07.21-12.20.27:255][860]LogTemp: Warning:     Committed Descriptor: (Hash=1073981341,MinLODs=[(0, 1),])FirstLODAvailable=[(0, 0),])FirstRequestedLOD=[(0, 1),])
[2025.07.21-12.20.27:255][860]LogTemp: Warning:     Requested Descriptor: (Hash=1073981341,MinLODs=[(0, 1),])FirstLODAvailable=[(0, 0),])FirstRequestedLOD=[(0, 0),])
[2025.07.21-12.20.27:255][860]LogMutable: Warning: Instance texture reuse requires that the current Mutable state is in non-streaming mode. Change it in the Mutable graph base node in the state definition.
[2025.07.21-12.20.27:255][860]LogMutable: Verbose: Creating Mutable instance with id [238] 

We would see similar logs in 5.5 but the number of LOD updates would reduce each frame as they were handled and loaded, but that doesn’t seem to be the case in 5.6.

Additionally, in Insights we see thousands of `Mutable_UCustomizableObjectSystem::TickInternal` timings each tick.

The issue seems to be fixed by running the `Mutable.ForceStreamMeshLODs` command. When we do this the meshes load correctly.

I’ve enabled `bEnableMeshStreaming` on our COs to avoid the issue for now, but we weren’t streaming these before due to the functionality being experimental.

I’ve also double checked our project prior to the upgrade and we didn’t enable LOD streaming in Mutable, though we do have LOD streaming enabled in the Static Mesh LOD data.

The issue also does not present itself in PIE. Only in client builds.

Do you have any guidance on what we can do to track down the root cause of this issue?

I also think that 5.6 contains a regression of one of the issues in this post: [Content removed]

In the latest version, the branch for all LODs has been reverted to a 2 instead of a 0 for `MinLODs`. Originally fixed in this commit: https://github.com/EpicGames/UnrealEngine/commit/473f36488090f6533abdd099a3ffaf610fbe60ce

I’ve changed this locally but it doesn’t seem to affect this issue.

Hi Liam.

Thank you for reporting the multiple issues you have found; that helps us quite a lot, so thank you. Would you be able to provide a content-based reproduction case so I can test out possible fixes for the issues described? If it’s not possible for you I would try working over our test assets but I may ask you for a reproduction case later if that proves not to be enough.

The thing about the 0 going back to 2 is to be expected as the functinoality of that method has changed so that I do not think is where the issue lays. In order to track down the issue I am going to need to recreate it locally so I can assess what may be happening there. If you could provide a reproduction case that would help quite a lot (I can make the ticket private to avoid content leaks if you want to go that route).

Have a nice day!

Daniel Moreno

Hi Daniel. Thanks for responding.

I’ve been investigating this issue when I’ve had the time but I’m unable to identify a repro.

I’ve tried running the Mutable Sample project from FAB in our custom engine version and it doesn’t run into any of the issues we’re seeing.

So the issue must be caused by something in our Actor setup or Mutable content.

In my original post, I said I didn’t encounter the issue in PIE but I was mistaken. Although it doesn’t appear that the TickableGameObjects time is increasing, I do still get the log spam of something being updated every frame. I’ve confirmed this isn’t due to a recent change since merging by syncing back to our merge CL.

[1585.28][842]LogMutable: Started Update Skeletal Mesh Async. CustomizableObject=MUT_TP_Character Instance=CustomizableObjectInstance_22, Frame=74844
[1585.28][842]LogMutable: Disabling "Started Update Skeletal Mesh Async" log during 5.000000 seconds due to spam
[1585.28][842]LogMutable: Verbose: Creating Mutable instance with id [24802] 
[1585.32][844]LogMutable: Verbose: Finished Update Skeletal Mesh Async. CustomizableObject=MUT_TP_Character Instance=CustomizableObjectInstance_22, Frame=74846  QueueTime=0.000000, UpdateTime=0.039406
[1585.34][845]LogMutable: Verbose: Creating Mutable instance with id [24803] 
[1585.38][847]LogMutable: Verbose: Finished Update Skeletal Mesh Async. CustomizableObject=MUT_TP_Character Instance=CustomizableObjectInstance_22, Frame=74849  QueueTime=0.000000, UpdateTime=0.039529
[1585.40][848]LogMutable: Verbose: Creating Mutable instance with id [24804] 
[1585.44][850]LogMutable: Verbose: Finished Update Skeletal Mesh Async. CustomizableObject=MUT_TP_Character Instance=CustomizableObjectInstance_22, Frame=74852  QueueTime=0.000000, UpdateTime=0.039375
[1585.46][851]LogMutable: Verbose: Creating Mutable instance with id [24805] 
[1585.50][853]LogMutable: Verbose: Finished Update Skeletal Mesh Async. CustomizableObject=MUT_TP_Character Instance=CustomizableObjectInstance_22, Frame=74855  QueueTime=0.000000, UpdateTime=0.039443

We’ll try digging into this more, and I’ll let you know if we make any progress. If we don’t, we may need to convert this to a confidential question as you’ve proposed.

Hi Liam.

Sounds good! Let us know about what you find, but just as a reminder, we are quite happy to debug the issue ourselves, so there is no need for you to spend more time on this. Just to let you know :slight_smile:

Have a nice day!

Daniel Moreno

Hi Liam,

I recommend having Mesh streaming enabled. We’ve been using it for our internal projects for a while now, and it works as expected. We’ll remove the experimental flag and change the default value to true in UE/Main.

I’ll try to reproduce the bug you mentioned locally, but I would appreciate it if you could give me more info about your project’s configuration.

  • Do you limit the number of instances to generate using the LOD Management class or have a custom LOD Management class?
  • Do you use Quality Level Min LODs in the CO? If so, could you send a capture of the Quality Level Min LOD set in the CO and Reference SkeletalMesh?

Regards,

Pere

Hi Pere, good to hear mesh streaming should be fine to leave on.

To answer your questions:

  1. We don’t use a custom LOD management class, but we do limit the number of instances based on scalability settings.
    1. The number of generated instances for LODs 0, 1, 2 can range between [2, 4, 999] and [10, 20, 999]. [0, 0, 0] for the cinematic preset.
    2. DistanceForFixedLOD2 also ranges from 2000 to 3000 based on scalability, with 50000 for cinematic.
  2. We haven’t set up anything for Quality Level Min LODs on the CO. Here’s a picture of our Mesh Component node and CO settings: [Image Removed][Image Removed]

We don’t get any errors when compiling the CO and the preview instance works without issue.

Thanks!

Limiting the number of instances to generate will work as expected, but you will have to give UE’s streaming manager some hints indicating the LODs you want to see. This is done per SkeletalMeshComponent. See USkinnedMeshComponent::OverrideMinLOD()

UFUNCTION(BlueprintCallable, Category = "Components|SkinnedMesh")
ENGINE_API void OverrideMinLOD(int32 InNewMinLOD);

Just so you know. Unlike the LOD streaming settings, Mutable will only consider the Quality Level Min LOD set in the CO node. If you want to discard LODs on a specific quality level, you’ll have to add that information there.