We’re working on a multiplayer action RPG with up to 50 MetaHuman NPCs active simultaneously. All groom assets are set to use cards only (no strand rendering), yet we’re seeing approximately 800 MB of total VRAM consumption from grooms — roughly 400 MB in asset data and another 400 MB in runtime Hair buffers (deformed positions, root triangles, guide buffers — around 5,366 buffer entries total across all characters).
The core issue is that groom VRAM allocations appear to be fully resident at all times. Unlike Nanite cluster pages or texture streaming, there doesn’t seem to be any mechanism to evict groom LOD data that isn’t currently in use. Moving far away from NPCs doesn’t reduce the memory footprint at all.
We’re running on an RTX 3070 (8 GB) and this single system accounts for nearly 25% of our tracked VRAM budget, which is pushing us into overflow.
A few specific questions:
- Is there any existing or planned support for groom memory streaming, similar to how Nanite or the texture streaming coordinator manages residency based on visibility and distance?
- Given that we’re exclusively using cards and not rendering strands, are the guide and strand-related runtime buffers (Hair.StrandsRootDeformed, etc.) still expected to be allocated? It seems like these shouldn’t be necessary in a cards-only configuration.
- Is there a recommended approach for managing groom memory at scale with many MetaHumans? We’re currently considering a pooling system that destroys/creates groom components based on distance, but we’d appreciate guidance on whether there’s a more engine-native solution we’re missing.
Any insight into the intended workflow for this scenario would be very helpful.
From RHI.DumpResourceMemory:
Buffers with owner “None” 400 MB:
[Image Removed]
Textures and Buffers with owner that contains “groom” 400 MB:
[Image Removed]
[Attachment Removed]