UE 5.8, cooked build, SSAM enabled (s.StreamableAssets.UseSimpleStreamableAssetManager=1, required by FastGeo).
Symptom: characters spawn at a crude LOD and can never stream up for the lifetime of the proxy.
FSkeletalMeshSceneProxy copies ForceStreamedLOD from FSkinnedMeshSceneProxyDesc at construction and encodes it as a negative TexelFactor in GetStreamableRenderAssetInfo, which only runs when the proxy is created. USkinnedMeshComponent::SetForceStreamedLOD reports later changes through IStreamingManager::NotifyPrimitiveUpdated, but FRenderAssetStreamingManager::NotifyPrimitiveUpdated
early-returns unconditionally when SSAM is enabled. Nothing else triggers a re-gather, so the streamer stays pinned to whatever LOD happened to be in effect at proxy creation.
This looks like a consequence of CL 53550964 (Main: 53550977 Sebastien Lussier) moving the gather from IPrimitiveComponent, which was deprecated there, onto the proxy. The component path was re-queried on
NotifyPrimitiveUpdated; the proxy path is a one-time snapshot.
Impact for us: an instrumented run showed 33 of 276 skeletal mesh registrations permanently pinned worse than requested. It is most visible on unique meshes such as named-character heads, since
residency is per asset via Max(LODNum - ForceStreamedLOD) and shared meshes get rescued by whichever requester wants the best LOD.
Local workaround: call MarkRenderStateDirty() in SetForceStreamedLOD (Engine\Source\Runtime\Engine\Private\Components\SkinnedMeshComponent.cpp)when SSAM is enabled and SceneProxy is non-null, forcing a re-gather.
Question: full proxy recreation is heavier than necessary. Would you prefer a targeted proxy-side update plus SSAM re-registration, or should SSAM expose a refresh entry point for this case?
Also verified present in //UE5/Release-5.8, //UE5/Dev-Release-5.8, //UE5/Main and //UE6/Main.
[Attachment Removed]