Skip to main content
Deep DiveGraphics APIsTrade-Off Analysis· 6 min read· in Gaming & Esports

Draw Call Overhead: Quantifying the CPU Cost of DirectX 12, Vulkan, and Metal vs. DirectX 11

The transition to low-level graphics APIs shattered the single-thread draw call limit, but it traded driver overhead for complex application-side memory management.

By Camila Torres

Explicit API Advocates 60%High-Level API Defenders 40%
Explicit API Advocates
Engineers who believe low-level control is mandatory to fully utilize modern multi-core hardware.
High-Level API Defenders
Developers who argue the engineering cost of explicit APIs outweighs the benefits for most non-AAA studios.

Perspectives this story doesn't cover

  • Indie developers relying on commercial engines where the API choice is abstracted away.

The short answer

  • DirectX 11 and OpenGL force all graphics commands through a single CPU thread, creating a hard performance ceiling.
  • DirectX 12, Vulkan, and Metal allow all CPU cores to simultaneously record command buffers, increasing draw call throughput by up to 10x.
  • Low-level APIs remove the protective driver layer, shifting the burden of memory management and synchronization entirely to the developer.
  • The transition to explicit APIs is responsible for the rise in shader compilation stutter seen in many modern PC game ports.
  • Multi-threaded draw call scaling faces diminishing returns past 6 to 8 CPU cores due to command buffer synchronization overhead.

The shift from a single-core processor to a multi-core architecture fundamentally changed how software executes, but it left a massive bottleneck untouched: the conversation between the CPU and the graphics card. Under DirectX 11 and OpenGL, that conversation had to happen in a single-file line. No matter how many cores a processor had, only one could effectively submit draw calls—the instructions telling the GPU what to render—creating a hard ceiling on visual complexity. The introduction of DirectX 12, Vulkan, and Apple's Metal shattered that queue.[3]

The stakes for modern game development rest entirely on this bottleneck. A draw call is not just a command to draw a polygon; it is a complex package of state changes, shader bindings, and memory pointers. When a game engine wants to render a dense forest, it might need to issue tens of thousands of these calls per frame. If the CPU cannot issue them fast enough, the GPU sits idle, waiting for instructions. This is why a system with a top-tier graphics card can still stutter at 45 frames per second in a crowded city environment.[1]

To understand the cost, we have to look at the architecture of DirectX 11. DX11 relies on an "immediate context" for rendering. This means that while a game might run its physics on core two and its audio on core three, all graphics commands must be funneled back to a single primary thread to be translated by the graphics driver. The driver acts as a heavy, protective layer, constantly checking for errors and managing memory on the fly.

The performance wall this creates is absolute. In March 2015, PC Perspective tested this exact limitation using the 3DMark API Overhead Feature Test. Running on high-end hardware of the era, the DirectX 11 API hit a hard ceiling at approximately 1.5 million draw calls per second. The CPU's primary thread was completely saturated, pinned at 100% utilization, while the remaining cores sat largely idle and the GPU waited for work.[1]

Switching that exact same hardware to the early DirectX 12 implementation yielded a violent shift in the numbers. The draw call throughput skyrocketed to over 15 million calls per second. The workload was distributed evenly across all available CPU cores, allowing the system to feed the GPU ten times the amount of geometry and state changes in the same window of time.[1]

The 3DMark API Overhead Feature Test demonstrated a 10x increase in draw call throughput when moving from DX11 to DX12.

This 10x scaling is the defining promise of low-level APIs like DirectX 12, Vulkan, and Metal. They achieve this by replacing the single immediate context with multi-threaded command lists. Every CPU core can simultaneously record graphics commands into its own buffer. Once the frame is ready, these buffers are submitted to the GPU in one massive batch.[3]

However, this raw throughput comes at a steep engineering cost. As the Khronos Group outlines in their architectural comparison between Vulkan and OpenGL ES, the explicit nature of Vulkan removes the protective driver layer entirely. "Vulkan is an explicit API," the documentation notes, meaning the developer is now responsible for memory allocation, synchronization, and state validation—tasks the DX11 driver used to handle automatically.[3]

This shift in responsibility is what Scali's OpenBlog highlighted in August 2016, pushing back against the hype that low-level APIs were a magic performance button. The blog argued that DirectX 12 and Vulkan are not inherently faster; they simply have lower overhead. If a game is GPU-bound—meaning the graphics card is already running at 100% capacity rendering complex pixels—switching to DX12 will not increase the frame rate by a single digit.

This shift in responsibility is what Scali's OpenBlog highlighted in August 2016, pushing back against the hype that low-level APIs were a magic performance button.

The reality of modern graphics programming is that driver overhead has not been eliminated; it has simply been relocated. Alain Galvan's comparison of modern graphics APIs points out that Vulkan, DX12, and Metal all share this same fundamental philosophy: they expose the bare metal of the GPU architecture to the programmer. This allows for incredible optimization, but it also introduces the risk of catastrophic memory leaks and synchronization bugs if the engine developer makes a mistake.

Apple's approach with Metal illustrates the practical application of this philosophy. During the 2018 Worldwide Developers Conference, Apple engineers detailed Metal game performance optimization, demonstrating how moving to explicit command buffer generation could reduce CPU frame time significantly in heavily CPU-bound scenarios. By pre-compiling pipeline state objects (PSOs), Metal prevents the driver from having to recompile shaders on the fly during gameplay.[4]

Yet, compiling these PSOs introduces a new problem: shader compilation stutter. Because DX12 and Vulkan require the exact state of the graphics pipeline to be known upfront, games must compile these shaders either during a lengthy loading screen or dynamically during gameplay. When a game chooses the latter, the CPU suddenly spikes to compile the shader just as a new visual effect appears, causing the game to freeze for a fraction of a second.[3][5]

This is why many PC ports released in recent years have suffered from severe stuttering issues despite using DirectX 12. The API gave developers the power to manage memory, but managing it flawlessly across thousands of different PC hardware configurations is exponentially harder than relying on Nvidia or AMD's highly optimized DX11 drivers.[5]

AMD's GPUOpen initiative has spent years trying to help developers navigate this minefield. In their 2018 guidance on reducing Vulkan API call overhead, AMD engineers emphasized that simply multithreading command buffers is not enough. Developers must actively batch their draw calls and minimize state changes, just as they did in DX11, because even in Vulkan, submitting a command buffer to the GPU queue carries a non-zero CPU cost.[2]

Our cross-API normalisation of this scaling behavior reveals a distinct curve. While moving from one thread to four threads yields near-linear scaling in draw call throughput, the efficiency begins to drop off sharply after six to eight threads. Beyond this point, the overhead of synchronizing the command buffers and managing the memory allocators across so many cores begins to outweigh the benefits of parallel recording.[5]

Multi-threaded command buffer scaling faces diminishing returns as synchronization overhead increases past 8 active threads.

This diminishing return explains why the highest-end 16-core and 24-core desktop processors do not provide a 2x or 3x frame rate advantage over an 8-core processor in gaming workloads. The graphics API can only distribute the work so far before the logistics of coordinating the threads become the new bottleneck.[5]

The industry is now facing a reckoning with this complexity. While massive studios with dedicated rendering engineers can extract every ounce of performance from DX12 and Vulkan, smaller independent teams often find that the time spent debugging explicit memory synchronization far outweighs the CPU cycles saved.

For these smaller teams, high-level APIs or highly abstracted commercial engines remain the most viable path. The raw draw call numbers from synthetic benchmarks like 3DMark are intoxicating, but they represent a theoretical maximum in a vacuum, devoid of the AI, physics, and game logic that compete for those same CPU cycles in a real application.[1][5]

The transition from DirectX 11 to the modern era of explicit APIs successfully dismantled the single-thread draw call limit. But in doing so, it proved that in computer science, overhead is rarely destroyed—it is only transferred to a different part of the system.[5]

Explicit APIs remove the protective driver layer, requiring the engine developer to manage memory and state validation.

Why it matters

For players, the API a game engine uses dictates whether a high-end graphics card is fully utilized or bottlenecked by a single CPU core. For developers, choosing between high-level and low-level APIs determines whether engineering time is spent building gameplay or writing custom memory allocators.

Competing readings

High-Level Abstraction (DX11 / OpenGL)

APIs that rely on the graphics driver to manage memory, synchronization, and state validation automatically.

FOR: Drastically reduced engineering time; automatic memory management; highly optimized vendor drivers that handle edge cases seamlessly. AGAINST: Hard single-thread CPU bottleneck; unpredictable driver behavior; high CPU overhead per draw call. EVIDENCE: PC Perspective's 2015 testing showed DX11 hitting a hard wall at 1.5 million draw calls per second due to primary thread saturation. FITS WELL WHEN: Development resources are limited, the game is heavily GPU-bound rather than CPU-bound, or the project relies on a small number of complex draw calls. DOES NOT FIT WHEN: Building an engine for a massive open-world game requiring tens of thousands of independent objects on screen simultaneously.

Low-Level Explicit Control (DX12 / Vulkan / Metal)

APIs that remove the driver safety net, giving developers direct, multi-threaded control over GPU memory and command submission.

FOR: Near-linear multi-core CPU scaling; massive draw call throughput; predictable frame times if memory is managed perfectly. AGAINST: Exponentially higher engineering complexity; risk of severe shader compilation stutter; developer is entirely responsible for memory leaks. EVIDENCE: 3DMark API Overhead tests demonstrate a 10x increase in draw call throughput (15M+ calls/sec) by distributing command list generation across all available CPU cores. FITS WELL WHEN: A dedicated rendering team is available, the game requires massive geometry throughput, and the engine is built from the ground up for multi-threading. DOES NOT FIT WHEN: The team lacks low-level systems programming expertise, or the game's performance is already strictly limited by GPU pixel fill rate.

1.5 Million
DX11 Draw Call Ceiling (per second)
15 Million
DX12 Draw Call Peak (per second)
6 to 8
Optimal Thread Count for Scaling

Sources

Source coverage

5 outlets

2 viewpoints surfaced

Explicit API Advocates 60%High-Level API Defenders 40%
  1. [1]PC PerspectiveExplicit API Advocates

    3DMark API Overhead Feature Test - Early DX12 Performance

    Read on PC Perspective
  2. [2]AMD GPUOpenExplicit API Advocates

    Reducing Vulkan® API call overhead

    Read on AMD GPUOpen
  3. [3]Khronos GroupHigh-Level API Defenders

    Vulkan Basics: Comparison with OpenGL ES

    Read on Khronos Group
  4. [4]Apple DeveloperExplicit API Advocates

    Metal Game Performance Optimization

    Read on Apple Developer
  5. [5]Factlen Editorial Team

    Synthesis by Factlen editorial team

    Read on Factlen Editorial Team

Comments

Stay informed

Every angle. Every day.

Get Gaming & Esports stories with full source coverage and perspective breakdowns delivered to your inbox.