5 Non-Obvious Solutions

Let's imagine that you have already configured batching, culling, and LODs. But you need to push just a little further to achieve optimal performance. Here are five not-so-obvious things that will help you to elevate your performance to the desired level!

  1. You can render shadows for objects based on a lower LOD for that object. For instance, the object might be at LOD0, but its shadow is rendered based on LOD2. To implement this, you can add r.forceLODShadow=[0..3] in the shadow quality settings within DefaultScalability.ini. From our experience, this technique has managed to reduce the overall frame polycount by 10-15% with some quality loss, and by 5% without noticeable degradation.


    [ShadowQuality@0]

    r.forceLODShadow=2


  2. In the pipeline without Nanite, it's possible to disable shadow casting for material slots used by LODs, which can save a small number of DrawCalls. If you want to delve deeper, 'Force Opaque' can be enabled specifically on Translucent materials for certain LODs.



  3. For those transitioning or who have already transitioned to UE5 pipelines: consider using Packed Level Blueprints for objects compositions (e.g., a house and its interior). This feature automatically instantiates objects inside and significantly reduces the number of Draw Calls. However, be aware, this tool imposes many restrictions. For instance, you can't apply vertex paint to an asset inside a Packed Level Blueprint (technically you can apply it, but it won’t be applied in the game). If you need vertex paint, there are several solutions available:

    1. Create a copy of the asset and apply vertex pain there. This option consumes more VRAM. It’s the only option for Nanite assets.

    2. Use a linked Level Instance and apply Vertex Paint in it. However, this will significantly increase the number of Draw Calls.


  4. Another trick that is highly beneficial for Open World games performance, is to leverage new grid system in improved Level Streaming (located in World Settings) in UE5. The concept is quite simple: there is a grid that divides the level into chunks, and these chunks load at specific distance. There could be multiple grids with unique settings (load distance and chunks size). All settings can be found in World Settings → Runtime Settings → Grids. For every object in the level, you can assign its grid (Runtime Grid parameter on the actor). For instance, a pipeline might look like this: a default grid with a sizable loading distance, and dressing grid (where smaller objects like books, jars, etc., would be) with a shorter loading distance. If setup correctly, performance improvements can be achieved swiftly since there will be a substantially smaller number of objects in memory and in the frame.


  5. You can optimize DrawCalls by using DetailMode when all other methods have been exhausted. For example, at low quality settings, you can choose not to render certain objects that don't affect collisions and don't significantly impact visual consistency (e.g., paintings on walls, empty cans on the floor). This is configured in the DefaultScalability.ini file, under the EffectsQuality section, with the parameter r.DetailMode=[0..2]. You'll need to assign a specific DetailMode to actors throughout the level, which can be automated with scripts based on actors’ bounding boxes, materials, and names.