How to implement a Dual Rendering Pipeline (High/Low Spec) similar to Fortnite's 'Performance Mode' in a single build?

Hello,

I am currently developing a PC game using Unreal Engine 5.4. We are testing support for both High-End PCs (using Lumen, Nanite, VSM) and Low-End PCs (using Forward Shading) within a ‘Single Build’.

I am looking for technical advice regarding the implementation of Fortnite’s ‘Performance Mode’, as it seems to be the best reference for our goal. We are currently researching switching Rendering Paths (Forward/Deferred) over the DX12 API.

Specifically, I have the following questions:

  1. Switching Rendering Pipelines: Does Fortnite’s Performance Mode utilize the ‘Mobile Forward Renderer’ (forced on PC), or does it use the standard ‘Desktop Forward Shading’?
  2. Implementation Strategy (INI Settings): Is the standard approach to modify specific CVars (like r.ForwardShading, r.Nanite) in the local Engine.ini via GameUserSettings or GConfig when a user changes options, and then force a Game Restart? Are there any specific .ini configurations or best practices you could share?
  3. Packaging & Shaders: To include shaders for both High-End (DX12, SM6) and Low-End (DX12/DX11, SM5) in a single package, what is the most stable configuration for TargetRHIs and D3D12TargetedShaderFormats in Project Settings?

Any insights from Epic staff or developers who have implemented similar dual-spec pipelines would be greatly appreciated.

Thank you.

[Attachment Removed]

Hello,

Apologies for the delay, it has taken some time to determine what was in use around the time frame of UE 5.4.

1 Switching Rendering Pipelines: Does Fortnite’s Performance Mode utilize the ‘Mobile Forward Renderer’ (forced on PC), or does it use the standard ‘Desktop Forward Shading’?

Around the time of UE 5.4, Fortnite used the Mobile Forward Renderer, but around UE 5.5 switched to Mobile Deferred. ([related post about Fortnite Performance Mode renderer and [Content removed]

2 Implementation Strategy (INI Settings): Is the standard approach to modify specific CVars (like r.ForwardShading, r.Nanite) in the local Engine.ini via GameUserSettings or GConfig when a user changes options, and then force a Game Restart? Are there any specific .ini configurations or best practices you could share?

Using a hierarchy of device profiles like we do for CitySample (e.g. XSXDeviceProfiles.ini) for pretty [Content removed] the preferred performance setting is stored in user settings and when you switch to performance mode it does require a restart because it’s switching from DX12/DX11 SM5/SM6 to DX12/DX11 ES31.

3 Packaging & Shaders: To include shaders for both High-End (DX12, SM6) and Low-End (DX12/DX11, SM5) in a single package, what is the most stable configuration for TargetRHIs and D3D12TargetedShaderFormats in Project Settings?

This will depend on your game’s target specs. We include DX12 SM6 for high-end, and the low end includes DX11/DX12 ES1, but you may not want to include DX12 SM6 Low if you want to reduce shader precaching and your game and prefer the ES1 performance configuration for low end.

I hope this helps, please let me know if you have additional questions.

Also, Epic will be on holiday break starting next week (Dec 22, 2025) and ending Jan 5, 2026 and there will be no responses from Epic on public or private tickets, though you may receive replies from the community on public tickets.

We wish you happy holidays!

[Attachment Removed]