Assertion failed: SimData->LODIndex != INDEX_NONE && SimData->LODIndex <= LOD [File:D:\jenkins\Build\Game\Engine\Source\Runtime\Engine\Private\GPUSkinCache.cpp] [Line: 814]

We are running into the following check in UE 5.6 when scrubbing through the rewind debugger:

Assertion failed: SimData->LODIndex != INDEX_NONE && SimData->LODIndex <= LOD [File:D:\jenkins\Build\Game\Engine\Source\Runtime\Engine\Private\GPUSkinCache.cpp] [Line: 814]

I think, I can explain what the problem is, although not with absolute certainty:

SKMs can have different cloth meshes for different LOD levels. Usually, the simulated cloth data (output vertices) will match the current frame. However, when using the rewind debugger, the game is paused and the cloth simulation doesn’t run when the game is paused. When scrubbing through the timeline, the current LOD level can change in which case, the simulated data will not longer match the current LOD level.

We “fixed” it by adding the following workaround to FSkeletalMeshObjectGPUSkin::ProcessUpdatedDynamicData:

// Update uniform buffer for APEX cloth simulation mesh positions and normals
if (bSectionUsingCloth)
{
	ClothShaderData = &ClothVertexFactory->GetClothShaderData();
	ClothSimulationData = DynamicData->ClothingSimData.Find(Section.CorrespondClothAssetIndex);
 
	// TRS CHANGE BEGIN - Georg Erhardt - 02/17/2026
#if WITH_EDITOR
	if (ClothSimulationData && ClothSimulationData->LODIndex != LODIndex)
	{
		ClothSimulationData = nullptr;
 
		UE_LOG(LogSkeletalMesh, Warning, TEXT("Disabled cloth simulation on %s because we don't have valid simulation data for this LOD level. Usually this happens when scrubbing in the rewind debugger."), *OwnerName.ToString());
	}
#endif
	// TRS CHANGE END - Georg Erhardt - 02/17/2026
	
	...

[Attachment Removed]

Steps to Reproduce
I haven’t had the time to try it with Vanilla UE and UE assets but theoretically, the repro should be as follows:

  • Find a SKM that has different cloth meshes for different LOD levels
  • Add an actor with a SkeletalMeshComponent to a map and assign the SKM. Make sure the physics work in PIE mode.
  • Start PIE mode
  • Start recording in the rewind debugger
  • Move the camera back and forth to enforce LOD changes
  • Pause the game (not sure if it matters, but do not stop PIE mode, just pause it)
  • Scrub in the rewind debugger by dragging the timestamp marker left and right (vertical line)

[Image Removed]

[Attachment Removed]

Hi there!

Thanks for reporting this issue, we made a similar change in UE 5.7 in

CL#45595781 Cloth - Fixed rendering crash when pausing cloth physics on a LOD &gt; 0 and switching the render back to a lower LOD.

The LODIndex check is a bit relaxed in our change though to allow for LOD biasing

			if (ClothSimulationData && ClothSimulationData->LODIndex > LODIndex)
			{
				// Can only render deform the simulation with positive LODBias which is
				// when the sim data LOD is lower than the requested render LODIndex.
				// Otherwise the cloth deformer mapping would be out of bounds.
				// This can happen when the physics is paused on a LOD >0 and then switching down the LODs.
				ClothSimulationData = nullptr;
			}

I’m passing this issue on to my colleague who is more familiar with this change for further advice.

[Attachment Removed]

What Alex said, the LODIndex could potentially be different with a Raytracing LOD bias on the Skeletal Mesh.

This said, I don’t think my fix addresses the case where the rewind debugger switches up the LODs (the rewind debugger wasn’t considered at the time of my changes).

I’ll take another look to see if I can work out a more general solution.

In the meantime, you probably want to keep your change.

[Attachment Removed]

Interesting. It’s not urgent but please let me know if you are making changes. Thank you!

[Attachment Removed]