MetaHuman performance - bug or feature?

OK tested the MetaHuman Project today. For the girl I get average of 24 fps, the guy getting down to like 14 fps when it gets close to the face with the “eyes” camera.

I compiled to a shipping built - no Blueprint Nativization. Geforce RTX 2060 (No “Super”!), Resolution “just” 1920x1200. 64GB DDR 4, core i7-8700. No overclocking, stock Windows 10 1903.

Is this “expected” performance? Just wondering since the guy in the demo said this was tested for mobile and such. So with RTX 2060 and “around” 1080p I was aiming for more on a shipping built to be honest. Never developed for cell phones or tablets, but I was ignorant enough to expect that an RTX 2060 desktop card would still beat all mobiles.

On a side note - i deleted all lights besides “bnc” spot light and doubled intensity of it. That gave me 10-15 fps more on the same setup.

I was reading 4.26 got some general performance issues and that it has significantly less fps than 4.25. So I am looking for some tricks to fix this.

A few things that make a big difference to performance:

  • Reduce the ‘quality level’ in the editor, which should disable ray tracing. Or you can just disable ray tracing as a project setting.
  • Force card grooms instead of strand grooms using ‘r.hairstrands.strands = 0’ (either in INI or console command)
1 Like

Ray Tracing and some rendering features seem to be terribly bugged in 4.26 regarding performance. You can see that clearly when you just open a blank project in 4.25 and one in 4.26 and look at the fps. I honestly don’t care about the fps in editor, not like I use the editor to enjoy 3D gaming. But the problem is that the fps drop also occurs in the built version. Until that is fixed I can only recommend to stick to 4.25 for making production releases.

SSGI comes enabled by default and RayTracing too, disable both and you get profit overall.

SSGI is a feature that’s x10 times more expensive of the whole Voxel Cone Tracing from other engines, makes no sense at all on performance/quality as is even SS only.

r.hairstrands.strands = 0 helped alot for me, along with turning off SSGI and Raytracing

For anyone who stumbles across this in the future: It is worth noting that the skeletal mesh for the face is very costly on performance at high LODs, such as LOD 0. I tested this with a lower end machine using a GTX 1070 on UE 5.2. Lowering the LOD to something like 3 here drastically increases performance (at a small visual quality cost of course). I was averaging at least 120 FPS at LOD 3, and about 90 with LOD 0, albeit there were game breaking FPS hiccups when trying to render the face up close at LOD 0. At LOD 3, this is not an issue and it runs super smooth. So, if you don’t have a beefy setup or are suffering from FPS issues with the metahumans (especially when trying to render the face up close), try lowering the face LOD.

Edit: If you want to be lazy, just set the LODSync component to force LOD 3 instead of -1 for example (or any LOD you want). Just note that this will set ALL meshes to be at that LOD, and not just the face. Don’t forget to set your scalability settings to what your machine can handle well also.

1 Like

Thank you for this. I optimised my metahumans using this.
But there’s still a lot of perf dips. I diagnosed and it’s mainly the Groom components. The hair and beard/fuzz etc.
The problem is MH-Creator says “this groom only is available on LOD 0 and 1” hence I set the overall Metahuman LOD to 1 (by forcing it) but it causes performance issues even then.
Not all characters have proper beard but some do and it’s essential to my game’s story and I simply can’t delete their beard.
Setting their fuzz/hair to LOD 2/3 renders them very dark and not so good looking.

How can I work around this? Any suggestions?

Sure, you can correct this quite easily. Note that the groom is only “available” at LODs 0 and 1, meaning they are only rendered at the higher quality in those LODs. BUT, these groom LODs can be independent of the other components, like the face mesh (and vice versa). In the LOD sync component, you can use the custom mapping section to change what LODs will be shown at from LOD levels, 0 - 7. Only the face mesh and grooms will actually utilize the 8 LODs, the other meshes only have 4 in total. For instance, you can set the custom mapping for the face to be LOD 3 for LODs 0, 1, 2 and 3, and then keep the 1 - 1 mapping from 4 - 7. Likewise, you can set the grooms to be at LOD 0 or 1 for LODs 0 - 7. Your best bet is to make the grooms something like, 0 for LODs 0 and 1, then 1 for LODs 2, 3, 4, then maybe just set them to the 1 - 1 mapping for the rest, as you want to keep that performance boost for when they are far away and not something the player will really notice far away. This custom mapping will ensure that the meshes will have decimated geometry to boost FPS, while maintaining the groom quality until they are too far away and no longer noticeable. The grooms and face mesh will have the densest geometry at higher LODs, so play with the numbers until you find a mesh that looks good, but still gives performance, as LOD 0 has like 60k triangles, and LOD 1 has about 40k. Maybe LOD 2 will be a safer bet as the highest possible LOD to render FPS wise.

Another approach which requires more work: You can modify the groom settings themselves so that LODs 0 and 1 have a more decimated geometry, or that the lower LODs look better than they currently do. This may require you to tweak the static meshes for these grooms though so they match up to the face mesh a little better.

I think the custom mapping would be your best bet. With custom mapping, you would not have to force a single LOD for all the components, but rather leave the value at -1 so they change automatically. Then the custom mapping would adjust the components correctly at each mapped LOD level. So when the sync component is at LOD 0 for example, the mapping can change the face mesh to be at LOD 2 here, and the grooms at 0 or 1, while keeping the other body meshes at whatever LOD you want.

As an example:

1 Like

Thank you so much for replying mate !

I was skeptical to try the custom mapping but your explanation is excellent. I’ll try this out tomorrow and will let you know about any developments.

PS: Since I wrote this, I have upgraded my project to 5.2.1 (from 5.0.3 and re-downloaded/exported all MH Characters) + I learned about the command “r.HairStrands.Strand 0/1” → to switch b/w HairCards and HairStrands and the Cards are giving some perf boost but not close to the original (i.e before adding Metahumans).
But I’ll try your solution and I feel positive. Along with that, I’ve decided to remake some metahumans in MH_Creator (i.e adjusting their hair/beard to the styles that Don’t say “Only Available at LOD 0/1” bcz they seem perf heavy)

Also mate, another small question. I have like 15 NPC characters using different MHs. Can I adjust one character’s LODSync Component and just copy paste it to others? Or are they unique to every character ? (Just wanna save time XD)

Thanks.

Yes you can, they are re-useable as all other components. And you can always make a child of it as well with the default values you like and give it to each NPC, same result. Just note, all the mesh component names in the NPC class must match those names in the Sync Component, otherwise you would need to rename them in the NPC class or correct the naming in the component options per NPC instance.

1 Like

Surely. I actually made a NPC Master BP with Mesh (i.e the body) then made required Child BPs and swapped the body mesh with the desired ones, and then simply copied the Face+Torso+Leg+Feet+LODSync from MH_BPs to my NPC Child BPs individually.

Now I can work fast knowing I need to adjust 1 LODSync and copy paste it across. Thanks.

Hey man !
I tried my hands on LODSync after deploying HairStrand.Strands 0
And this is the screenshot


I had a doubt. Do I need to set Face and Hair from Passive to Drive in ComponentsToSync column? Or leave them as is?

Perf seems better but one issue is the eyebrows. They look hideous up close as they disappear but become visible when I move away. How to fix that?

Eyebrows hidden


Eyebrows visible

I mean I want the opposite to happen. Eyebrows to only disappear if player/camera is far away. Tho I won’t mind if they’d rather not disappear at all. Any solution my friend?

From the screenshots, I don’t see the Eyebrows component listed in the custom mapping, so they would be using the default LODs, which would be 1 - 1 with the sync component. Have you tried adding the eyebrow component to the sync component custom mapping (just like you did for the Hair component there)? Also, yes you can leave them as passive and the face as drive. The face is driving the other components attached to it. As for the strands = 0, this will force cards and not strands, so they will give better performance at the cost of visual quality. Try adding the eyebrows to the custom mapping and see if it corrects them from disappearing, but I think the issue there is the cards being forced instead of strands, so the higher LODs aren’t rendering them. This could be fixed by setting the groom settings at those high LODs to be cards, or just use a lower starting LOD in the custom mapping so they render like they do when far away.

1 Like

I did try custom mapping by copying the values from Hair onto the new entry for EyeBrows but somehow it didn’t work.

I’ll try it again. And yes, I have decided I’ll use cards bcz I’ll prefer performance and the hair quality loss isn’t that bad. TBH I just want eyebrows to render at close distance and disappear when far away, basically the opposite of current situation and I’m done with optimising Metahumans.
So I’ll try what you said and report back.

Thanks !

Edit - It didn’t work. @SteveRambo
I tried multiple values inside Custom Mapping. It just doesn’t work. I feel you’re right that Higher LODs are forcing Strands and lower has cards. But how can I adjust those groom settings? I tried enabling “UseCards” on Eyebrows but it doesn’t work somehow. Anything else I can try?

Sent you the solution in a DM. Please refer any other questions to the DM to free up this post. Thanks!

Posting for visibility. I made a guide detailing how to optimize your MetaHuman with relative ease.