Resolution is the best predictor of electricity use. By setting dynamic limits, Fortnite ensured that it never draws a sharper image than the game needs.
The following content was taken from Epic’s Reducing Fortnite’s power consumption documentation. All credit to the authors!
Epic Games recommends using Unreal Engine’s dynamic resolution to keep a consistent frame rate while maximizing available GPU computing power, and we make heavy use of this in Fortnite. Dynamic resolution works by adjusting the resolution based on the current GPU frame time in order to hit a specified budget in milliseconds. Temporal Super Resolution (TSR)—or Temporal Anti-Aliasing Upscaling (TAAU) on lower-end platforms—is then used to upscale the current frame to the final resolution (typically to 4K on PS5 or Xbox Series X).
Dynamic resolution is a useful tool for maximizing GPU performance, but care is needed to ensure that it doesn’t increase power load beyond what is necessary. If a game’s dynamic resolution rarely or never hits the configured maximum value, the GPU load will be close to 100% most of the time, and this has a corresponding impact on power consumption. Reducing the maximum resolution enables the GPU load to decrease when performance is good and also brings some performance benefits. If you’re using a high-quality upscaler such as TSR, it’s often possible to reduce the maximum resolution without a perceptible difference in visual quality.
Note: More info on dynamic resolution can be found in the Unreal Engine 5 documentation.
Analyzing dYnamic resolution in fortnite
We looked at detailed performance data to see how dynamic resolution changed based on scene complexity in different Fortnite game modes on PS5 and Xbox Series X. We found that the game was rarely running at the configured 75% maximum resolution in Battle Royale matches. In other game modes, such as Creative, resolution was higher, but the visual benefit wasn’t noticeable.
We did some visual comparisons of the game at different resolutions both in static scenes and in motion. We found very little difference between 65% and 75% resolution when using TSR for upscaling.
As a result of this analysis, we dropped the maximum resolution to 65% on both PS5 and Xbox Series X. This reduced power consumption both in game and also in the front-end screens.
Recommendation
Developers can adjust their game’s maximum resolution setting using the r.DynamicRes.MaxScreenPercentage console variable in engine or device profile ini files. Note that this defaults to 100.
We recommend doing some visual comparisons of different scenes, both in motion and static, trying different resolutions using the console variable r.DynamicRes.TestScreenPercentage. Try to find the threshold at which raising the resolution is no longer perceptible. If you’re using Temporal Super Resolution, it’s likely you can reduce the maximum resolution without any perceptible visual differences.
Developers can also look at the dynamic resolution stat during gameplay using Unreal Insights or the CSV Profiler to see the typical ranges across different scenes and game modes. If your game is almost never rendering at the maximum resolution, it’s likely that the GPU is close to 100% load all the time; the maximum resolution should be configured to avoid this.
In addition to reducing power consumption, you may see some performance benefits from lowering your maximum resolution. Internal render targets are allocated according to the maximum resolution, so reducing this improves the performance of fullscreen resolves and clears and also brings cache benefits. Frame rate will also be more consistent if you’re hitting the maximum resolution more often, because there is more headroom to absorb variance in GPU load.
Developers can also try increasing the console variable r.DynamicRes.TargetedGPUHeadRoomPercentage (default: 10). By tuning this parameter, you are effectively telling the engine what fraction of time you would like the GPU to be idle. This is a more direct way of reducing power consumption but at the cost of visual fidelity. As an example, if you really wanted to be aggressive, you could use this to indicate you want to target 12 ms/frame, leaving the GPU idle for ~25% of the time on average and reducing GPU power consumption by a corresponding amount. The engine will lower resolution to try to hit that target.