Technical guide

CPU vs GPU Bottleneck Explained: Frame Time, Utilization, Resolution, and How to Diagnose

Understand CPU-limited and GPU-limited game performance, why utilization percentages can mislead, how resolution and settings shift workload, and how to diagnose the limiting stage with frame-time evidence.

On this page
  1. A bottleneck is the stage that currently limits frame completion, not a permanent property of two parts
  2. Frame time is the useful output; average FPS and utilization are supporting signals
  3. A CPU limit often appears when one or a few critical threads cannot finish their frame work sooner
  4. A GPU limit means the rendering workload cannot complete any faster at the current settings
  5. Resolution is a useful diagnostic lever because it usually changes GPU pixel work more than game simulation
  6. Low GPU utilization does not automatically mean “CPU bottleneck”
  7. Use controlled A/B changes to identify which part of the workload responds
  8. A “balanced” PC is workload-specific, so evaluate the games and frame-rate targets you actually use

A bottleneck is the stage that currently limits frame completion, not a permanent property of two parts

In a game, the CPU and GPU participate in a pipeline rather than independently producing final frames. The CPU runs game logic, simulation, draw-call preparation, driver/API work, asset-management tasks, and other per-frame work; the GPU executes the rendering workload submitted to it. Intel’s Graphics Performance Analyzer documentation describes CPU-bound behavior as the GPU waiting because work is not being supplied quickly enough, and GPU-bound behavior as the CPU or submission side waiting while the GPU remains occupied.

That limiting stage can change from one game, scene, camera angle, settings preset, or frame-rate target to another. A computer therefore does not have one universal CPU/GPU “bottleneck percentage.” The useful question is which stage constrains the exact workload you are measuring now, and whether changing that stage changes frame time in the direction your diagnosis predicts.

Frame time is the useful output; average FPS and utilization are supporting signals

Frame time describes how long frames take to be produced and presented over time. NVIDIA FrameView and Intel PresentMon both expose frame-rate and frame-time-oriented telemetry, while Intel’s current PresentMon tooling adds GPU Busy information specifically to help assess the balance between CPU and GPU work. Looking at a frame-time graph makes spikes and unstable pacing visible in a way that one average FPS number cannot.

Do not infer the limiter from one utilization counter alone. A GPU can show less than maximum utilization because it is waiting for CPU work, because the game is frame-capped, because synchronization or presentation is limiting throughput, or because the sampled counter does not represent every relevant engine. Likewise, a CPU can limit a game through one heavily loaded thread while total package utilization remains far below 100 percent because the remaining logical processors are not equally busy.

A CPU limit often appears when one or a few critical threads cannot finish their frame work sooner

Games rarely distribute every task perfectly across all available CPU threads. Epic’s performance-profiling documentation describes a CPU bottleneck as too much work occurring on one or more CPU threads during a frame, including gameplay logic and other core systems. That is why total CPU utilization is a poor universal threshold: on a many-core processor, one critical game or render thread can determine frame completion while substantial aggregate CPU capacity remains unused.

CPU-heavy conditions commonly become more visible at high frame rates, in simulation-heavy scenes, with large numbers of active entities, or with settings that increase CPU-side work such as view distance or object density. The exact behavior is engine-specific. A low GPU-utilization reading combined with a repeatable frame-rate ceiling can support a CPU-limit hypothesis, but thread timing and controlled setting changes provide stronger evidence than the utilization number by itself.

A GPU limit means the rendering workload cannot complete any faster at the current settings

A GPU-bound frame spends its limiting time on graphics or compute work executed by the GPU. Intel’s trace-analysis guidance describes a GPU-bound workload as one where the GPU remains busy and work queues accumulate while CPU threads spend more time inactive or waiting. Epic’s profiling tools similarly expose separate game-thread, render-thread, and GPU timing so developers can identify which side is taking the longest.

Graphics settings that increase shading, ray tracing, geometry, post-processing, resolution-scaled buffers, or other rendering work can increase GPU frame time. If reducing a clearly GPU-heavy setting repeatedly lowers frame time while the CPU-side workload is otherwise unchanged, that supports a GPU-limit diagnosis. The important evidence is the response of the measured workload, not an arbitrary rule that the GPU must report exactly 99 or 100 percent utilization.

Resolution is a useful diagnostic lever because it usually changes GPU pixel work more than game simulation

Changing render resolution alters the number of pixels the graphics pipeline must shade and the size of resolution-dependent buffers. Epic’s dynamic-resolution documentation notes that the number of pixels rendered changes with screen percentage in both dimensions, while its profiling tools expose CPU and GPU timing separately. That makes resolution or render scale a useful controlled variable when diagnosing whether the graphics side is limiting a scene.

If a substantial resolution reduction produces a substantial frame-time improvement in the same scene, the GPU side is more likely to have been important. If frame rate barely moves while GPU work falls, the limiter may be on the CPU side, a frame cap, synchronization, or another subsystem. This is a diagnostic experiment, not a law: some effects do not scale strongly with resolution, and changing presets can alter CPU-facing settings at the same time, so change one variable at a time whenever the game allows it.

Low GPU utilization does not automatically mean “CPU bottleneck”

The GPU can be underutilized for several reasons that are not a slow CPU. A frame-rate cap or synchronized presentation can deliberately stop the application from producing more frames. Asset streaming can leave the renderer waiting for data. Shader or pipeline compilation can create short CPU-side hitches. VRAM pressure can trigger residency management and stalls. Driver faults, background work, power limits, thermal limits, or game-engine synchronization can also change the pattern.

Treat low utilization as a clue that needs context. Check whether the game is capped, whether the frame-time graph shows a steady ceiling or isolated spikes, whether the same scene behaves differently after a repeat pass, whether VRAM pressure changes with texture settings, and whether clocks or temperatures indicate throttling. The existing shader-compilation and GPU-VRAM guides cover two common branches that should not be collapsed into a generic CPU-bottleneck diagnosis.

Use controlled A/B changes to identify which part of the workload responds

Start with a repeatable scene or benchmark path and record frame time plus CPU/GPU telemetry. First verify that an intentional frame cap, V-Sync behavior, background process, or obvious thermal/power limit is not defining the result. Then change one variable with a strong expected effect: lower render resolution or a GPU-heavy graphics setting; separately reduce a CPU-facing setting such as simulation density, crowd count, or view distance when the game exposes one.

Interpret the direction of change rather than chasing a universal percentage. A large improvement after reducing GPU work supports a GPU limit. Little response to lower resolution, combined with evidence of a saturated critical CPU thread or GPU waiting, supports a CPU-side limit. If the symptom is instead an isolated hitch, texture pop-in, crash, network pause, or storage stall, branch into the appropriate diagnosis rather than forcing every performance problem into a CPU-versus-GPU model.

A “balanced” PC is workload-specific, so evaluate the games and frame-rate targets you actually use

The same CPU and GPU pairing can be GPU-limited in a visually demanding game at a high resolution, CPU-limited in a competitive title targeting very high frame rates, and limited by neither component when a frame cap is intentionally below what both can deliver. Intel explicitly notes that scene characteristics and settings can move a workload between CPU-bound and GPU-bound states. That is why generic online bottleneck calculators that output one fixed percentage for a CPU/GPU pair cannot represent the full system behavior.

For an upgrade decision, use representative benchmarks or your own controlled captures from the actual games, resolutions, settings, and frame-rate targets that matter to you. Diagnose the current limiter first, then ask whether upgrading that component meaningfully changes the target workload. Do not assume that replacing the nominally slower part guarantees an improvement if another stage, memory-capacity issue, frame cap, engine limit, or thermal/power condition remains in the way.

Sources

Primary and technical sources

Technical details can vary by exact model, firmware, and platform. These are the sources used for the factual claims in this article.

  1. 01 Intel

    CPU- and GPU-bound scenarios, scene/settings dependence, and trace-based bottleneck analysis
  2. 02 Intel

    Intel PresentMon: frame-time telemetry and GPU Busy for assessing CPU/GPU balance
  3. 03 Intel

    Graphics Trace Analyzer: GPU-bound signatures using GPU activity, queues, and CPU thread state
  4. 04 Epic Games

    Performance profiling in Unreal Engine: CPU, GPU, memory, and other possible bottleneck categories
  5. 05 Epic Games

    Unreal Engine dynamic resolution: Stat Unit CPU/GPU timing and screen-percentage behavior
  6. 06 NVIDIA

    NVIDIA FrameView: frame-rate and frame-time performance capture using PresentMon analytics

Related