Pular para o conteúdo

Tracy Profiler - Real-Time Frame Profiler

Tracy Profiler - Real-Time Frame Profiler

Tracy é um profiler de frame e amostragem híbrido, em tempo real, com resolução de nanosegundo, amplamente usado em jogos e C++ e Rust de baixa latência. Você adiciona macros leves de zone ao seu código, e Tracy faz stream de dados de timing ao vivo para uma UI desktop onde você pode ver cada frame, cada zone, timings de GPU, alocações de memória, e contenção de lock conforme o programa executa. Sua combinação de instrumentação manual mais amostragem automática dá tanto zones semânticos precisos quanto hot spots não atribuídos.

Instalação

ComponenteComo
Server (UI)Construir profiler/ do repo ou baixar uma release
Client (library)Adicionar TracyClient.cpp + headers à sua compilação
Rustcargo add tracy-client (ou tracing-tracy)
HabilitarCompilar com TRACY_ENABLE definido
VerificarLançar a UI; ela aguarda uma conexão de client

Instrumentando C++

#include "tracy/Tracy.hpp"

void update() {
    ZoneScoped;                    // zone nomeada após a função
    physics();
}

void render() {
    ZoneScopedN("Render Pass");    // nome explícito
    ZoneColor(0x00FF00);
    draw();
}

int main() {
    while (running) {
        update();
        render();
        FrameMark;                 // marca um limite de frame
    }
}
MacroPropósito
ZoneScopedFazer timing do escopo envolvente
ZoneScopedN("name")Zone nomeada
ZoneText(str, len)Anexar texto a uma zone
FrameMarkDelimitar frames
TracyPlot("fps", v)Plotar um valor numérico ao longo do tempo
TracyMessage(...)Log uma mensagem na timeline
TracyLockable(...)Rastrear contenção de mutex

Instrumentando Rust

use tracy_client::{Client, span};

fn main() {
    let _client = Client::start();
    loop {
        {
            let _s = span!("update");
            update();
        }
        tracy_client::frame_mark();
    }
}

Ou wire it into tracing com a crate tracing-tracy para que spans existentes apareçam em Tracy automaticamente.

Memória & GPU

CaracterísticaComo
Rastreamento de alocaçãoTracyAlloc(ptr, size) / TracyFree(ptr)
Alocadores customizadosEncapsular alloc/free com os macros
GPU zones (Vulkan/D3D/OpenGL)TracyVkZone, TracyD3D12Zone, etc.
Contexto de GPUCriar uma vez, depois zones anexam a ele

A UI

ViewMostra
TimelineZones por thread, frame por frame
StatisticsTempo agregado por zone
Find zoneHistograma de durações de uma zone
CompareDiff duas capturas (antes/depois de uma mudança)
MemoryTimeline de alocação e leaks
LocksContenção entre threads
Flame graphEstrutura de chamada agregada

Workflow: Perseguindo um Frame Spike

PassoAção
1Executar com o client conectado; reproduzir o hitch
2Encontrar o frame longo na timeline
3Zoom in — qual zone domina?
4Abrir “Find Zone” para aquela zone → histograma de duração
5Verificar contexto do outlier (locks, alocações, espera de GPU)
6Consertar, capturar novamente, usar Compare para provar a melhoria

Esse workflow de comparar-duas-capturas é uma das características mais práticas de Tracy — transforma “sente mais rápido” em um delta medido.

Modo de Amostragem

Além de zones manuais, Tracy pode amostrar call stacks automaticamente (Linux/Windows), capturando tempo em código que você não instrumentou. Combine ambos: zones dão estrutura semântica, amostragem preenche os gaps.

Tracy vs Profilers Relacionados

AspectoTracyperfPerfetto
ModeloZones instrumentados + amostragemAmostragemTracing system-wide
ResoluçãoNanosegundoIntervalo de amostraEvent-level
Visualização ao vivoSim (tempo real)NãoPost-hoc
Suporte a GPUIntegradoNãoParcial
Melhor paraJogos, frame-based, C++/Rust de baixa latênciaHot paths de CPUTimelines whole-system

Complementa perf e Perfetto; vantagem de Tracy é profiling ao vivo, orientado a frame, instrumentado.

Recursos