Profile Construct on Windows

Find where a slow start, a slow frame or a stutter comes from, with PIX, PresentMon and Construct's timing lines

Construct renders with Direct3D 12 on Windows. This page shows how to find where a slow start, a slow frame or a stutter comes from, using the tools that Windows and the GPU vendors provide. Construct writes what those tools read. It has no profiler of its own.

You need a build of Construct from 2026-10-01 or later.

Read the timing lines first

Construct writes timing lines to its log. Start it from a terminal and search the output for [TIMING]:

construct.exe gui > construct.log 2>&1
Line What it measures
[TIMING] milestone first-presented-frame <ms> From process start to the first frame the viewport shows. On a first start, this frame is the placeholder that shows while your scene's shaders build.
[TIMING] milestone first-scene-frame <ms> From process start to the first frame of your scene. This is the wait you see.
[TIMING] pipeline create sdf-<pass> <ms> The time to create one GPU pipeline. The first time the driver sees a shader this takes seconds. After that it takes about a millisecond.

If the first start is slow and later starts are fast, the driver is compiling shaders for the first time. This happens once after a driver update, or after the driver's shader cache is cleared. Construct prepares the pipelines it is about to need on a helper thread, so the editor stays responsive while the driver compiles. The compile itself still takes however long the driver needs.

Name the passes in a GPU capture

Start Construct with --gpu-markers:

construct.exe gui --gpu-markers

Each viewport pass then appears by name in PIX on Windows and in Radeon GPU Profiler:

Name What the GPU does
geometry-passes Writes the depth and surface buffers of the scene
main-pass Shades the scene
post Runs the post effects: bloom, tone mapping, anti-aliasing
present Draws the finished frame into the editor window
pick Finds what is under the mouse pointer
pathtrace-geometry, pathtrace-accumulate Path tracing: the primary hit, then one sample added to the image

Without the switch, a frame shows up as one unnamed block. The switch costs nothing measurable while no capture is running.

To take a capture with PIX from the command line:

pixtool launch "C:\path\to\construct.exe" --command-line=--gpu-markers --captureFromStart take-capture --frames=300 save-capture construct.wpix

You need Windows Developer Mode to open or analyse a capture (Settings → System → For developers).

Compare with Vulkan

Construct also runs on Vulkan on Windows, which makes Vulkan a reference to compare against on the same machine. Start it with --rhi-backend vulkan:

construct.exe gui --rhi-backend vulkan

If a scene is slow on both, the cause is the scene or the GPU. If it is slow on only one, the cause is that API's path, and a capture of each shows where they differ. Vulkan on Windows hands frames to the window through memory rather than sharing them on the GPU (see Understand viewport transport and performance), so compare GPU time, not only frame rate.

Find out why the GPU refused something

When a pipeline fails to build, the log names the pipeline, but Direct3D 12 reports the reason only to its debug layer. Run Construct with --rhi-debug under a debugger that shows debug output, for example:

cdb -g -G construct.exe gui --rhi-debug

Lines that start with D3D12 ERROR: name the cause. The debug layer is part of the Windows Graphics Tools optional feature.

Measure frame pacing

PresentMon records every frame Construct presents, and the time from a click to the frame that shows it:

presentmon --process_name construct.exe --output_file frames.csv --timed 10 --terminate_after_timed

Drag the camera while it records. In the CSV, MsBetweenPresents is the time between frames, and a long interval is a stutter.

Watch the whole machine

The Monitor activity shows CPU use per core, memory, each GPU's load and video memory, and every running process, on Windows as on Linux. See Monitor system resources.

Topics
howto construct rendering performance windows profiling