AI upscaling will not save your frame budget (if you are CPU bound)
DLSS, FSR and friends are great. They also fix exactly one kind of problem
Contents
No, so, every second performance discussion now ends with "just turn on DLSS". Players say it, okay. Producers say it, less okay. Last month a producer said it in a meeting about our game thread at 21 ms. I almost had a stroke.
What upscaling actually does
Temporal upscalers (DLSS Super Resolution, FSR, XeSS, Unreal's own TSR) render the frame at a lower internal resolution and reconstruct a higher resolution image using previous frames, motion vectors and, for some of them, a neural network. Fewer pixels shaded per frame. This reduces GPU work that scales with resolution: shading, post process, a lot of the lighting.
It does nothing for:
- Game thread: gameplay, Blueprints, AI, animation logic.
- Render thread: culling, draw call submission.
- GPU work that does not scale with pixels (some shadow passes, simulation).
Frame generation (the "AI makes extra frames" feature) is something else again: it inserts generated frames between real ones. The fps counter goes up. Input latency does not get better, and the game still updates at the real rate. If your game runs 30 real fps and frame gen shows "60", it still feels like 30 when you move the mouse, sometimes a bit worse.
How to know if it will help you
Same as in my frame budget post: stat unit. Then:
r.ScreenPercentage 50
If GPU time drops a lot and frame time follows, you are GPU bound on pixels, and upscaling will help. If frame time does not move, you are CPU bound and upscaling is a very expensive placebo.
Our case:
100% 50% screen percentage
Frame: 21.4 ms 21.1 ms
Game: 21.0 ms 20.9 ms
GPU: 15.2 ms 7.9 ms
GPU time halved. Frame time did not care. Game thread is the boss. Turning on upscaling would make our GPU idle more, very relaxing for the GPU, zero difference for the player.
What we did instead
- Moved enemy perception to update every 0.2 s with staggered offsets, so not all 80 enemies think on the same frame.
- Animation budget: distant characters update animation at a lower rate (the Animation Budget Allocator plugin, and URO, the update rate optimisations).
- Found one Blueprint doing a sphere trace for every pickup, every frame. Replaced with overlap events. (Yes, again. Always Tick.)
Result: game thread from 21 to 14.6 ms. Then we turned on upscaling for the GPU side on lower end hardware, where it helps properly.
So
Upscaling is fantastic technology and I use it as a player all the time. But it is a GPU tool. If someone in a meeting says "just turn on DLSS" about a CPU problem, send them this post. Or send them to me, I am in the office until 23:00 anyway, as usual, k***a.
Written by
Bartek Wójcik
Gameplay programmer, C++ and Unreal, Warszawa. Shipped 2 games, 1 cancelled, 0 regrets (lie). Crunch survivor. Gram w szachy i piję za dużo kawy.
Get the best of #pixels-and-polygons weekly
One email each Monday with the most useful posts. No spam; unsubscribe in one click.
Comments
Sign in to join the conversation.
Sign in to comment