Quick answer: Tracy zones compile to nothing unless TRACY_ENABLE is defined. Check the build, instrument hot functions with ZoneScoped, and call FrameMark at the end of each frame.

Tracy connects and shows the frame timeline, but each frame is empty inside — no zones, no callstack. The instrumentation isn’t compiled in.

Enable Tracy in the Build

Tracy macros expand to nothing unless TRACY_ENABLE is defined for the compilation unit. In CMake:

target_compile_definitions(MyGame PRIVATE TRACY_ENABLE)

Without it, Tracy connects (the client lib has zero overhead in disabled mode) but reports nothing.

Instrument Hot Functions

void UpdatePhysics()
{
    ZoneScoped;
    // ...
}

ZoneScoped at function start times the scope. Add to the major systems first — the timeline immediately becomes useful.

FrameMark Per Frame

void GameLoop()
{
    while (running) {
        RenderFrame();
        FrameMark;   // at end of each frame
    }
}

Without FrameMark, Tracy can’t segment data into frames — you get a continuous stream with no per-frame stats.

Plot Custom Values

Use TracyPlot("FPS", fps) to graph custom counters — entity count, draw calls, memory. Correlates beautifully with zone timing.

Verifying

Frames in Tracy contain colored zones for every instrumented function. Plots track over time. Flame graphs show callstacks.

“Tracy needs TRACY_ENABLE + instrumentation + FrameMark. Connect alone isn’t enough.”

Wrap ZoneScoped in your own PROFILE_FUNC() macro — lets you swap profilers (Optick, Superluminal, etc.) without touching every file.