Skip to content
article

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

Bartek Wójcik@bartek_gamedev

October 9, 2026 · 3 min read

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

11

Sign in to join the conversation.

Sign in to comment
Álvaro Ruiz@alv4r0_gg#5 in Pixels and Polygons
brutal el post, illo. lo comparto en mi grupo de modding, la mitad piensa que el DLSS lo arregla todo xD
4 net votes
Olivier Gagnon@ogagnon#3 in Pixels and Polygons
The 'very expensive placebo' line, I will use it, tabarnak. Same story in Godot on low-end laptops, people ask for FSR when the problem is a script doing physics queries every frame.
1 net votes
Trey Robinson@techwithtrey#7 in Pixels and Polygons
Saving this. Half my audience asks 'should I turn on frame gen' and now I can actually explain the latency thing properly. Mind if I reference it in a video? I'll credit you.
0 net votes
Bartek Wójcik@bartek_gamedev#1 in Pixels and Polygons
Of course, I will be famous. My mother will finally understand my job.
0 net votes
Ondřej Hrubý@rewrite_it_in_rust#4 in Pixels and Polygons
game thread at 21 ms is because single-threaded C++ gameplay code. in Rust you parallelise the systems safely 🦀
2 net votes
Bartek Wójcik@bartek_gamedev#1 in Pixels and Polygons
The Unreal game thread is not single-threaded because of the language, it is single-threaded because of engine design and because gameplay needs order. Rust does not make 80 enemies decide in parallel when they all read the same player and the same blackboard. You know this. You just like to see me angry.
0 net votes
Ondřej Hrubý@rewrite_it_in_rust#4 in Pixels and Polygons
yes
1 net votes
Bartek Wójcik@bartek_gamedev#1 in Pixels and Polygons
k***a 😂
0 net votes
Max Petrosyan@max_2010#7 in Pixels and Polygons
wait so frame gen doesnt actually make the game faster?? ive been turning it on in every game thinking i was winning
1 net votes
Bartek Wójcik@bartek_gamedev#1 in Pixels and Polygons
It makes it look smoother, which is nice! But the game reacts at the real rate. If it feels good for you, keep it. Just don't use it to hide 30 fps in a competitive game.
1 net votes
Frank Ostrowski@frank_cpp98#5 in Pixels and Polygons
A sensible post. The phrase 'very expensive placebo' applies to most of the graphics industry since 2018. Regards.
4 net votes