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
| Componente | Como |
|---|
| Server (UI) | Construir profiler/ do repo ou baixar uma release |
| Client (library) | Adicionar TracyClient.cpp + headers à sua compilação |
| Rust | cargo add tracy-client (ou tracing-tracy) |
| Habilitar | Compilar com TRACY_ENABLE definido |
| Verificar | Lanç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
}
}
| Macro | Propósito |
|---|
ZoneScoped | Fazer timing do escopo envolvente |
ZoneScopedN("name") | Zone nomeada |
ZoneText(str, len) | Anexar texto a uma zone |
FrameMark | Delimitar 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ística | Como |
|---|
| Rastreamento de alocação | TracyAlloc(ptr, size) / TracyFree(ptr) |
| Alocadores customizados | Encapsular alloc/free com os macros |
| GPU zones (Vulkan/D3D/OpenGL) | TracyVkZone, TracyD3D12Zone, etc. |
| Contexto de GPU | Criar uma vez, depois zones anexam a ele |
A UI
| View | Mostra |
|---|
| Timeline | Zones por thread, frame por frame |
| Statistics | Tempo agregado por zone |
| Find zone | Histograma de durações de uma zone |
| Compare | Diff duas capturas (antes/depois de uma mudança) |
| Memory | Timeline de alocação e leaks |
| Locks | Contenção entre threads |
| Flame graph | Estrutura de chamada agregada |
Workflow: Perseguindo um Frame Spike
| Passo | Ação |
|---|
| 1 | Executar com o client conectado; reproduzir o hitch |
| 2 | Encontrar o frame longo na timeline |
| 3 | Zoom in — qual zone domina? |
| 4 | Abrir “Find Zone” para aquela zone → histograma de duração |
| 5 | Verificar contexto do outlier (locks, alocações, espera de GPU) |
| 6 | Consertar, 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
| Aspecto | Tracy | perf | Perfetto |
|---|
| Modelo | Zones instrumentados + amostragem | Amostragem | Tracing system-wide |
| Resolução | Nanosegundo | Intervalo de amostra | Event-level |
| Visualização ao vivo | Sim (tempo real) | Não | Post-hoc |
| Suporte a GPU | Integrado | Não | Parcial |
| Melhor para | Jogos, frame-based, C++/Rust de baixa latência | Hot paths de CPU | Timelines whole-system |
Complementa perf e Perfetto; vantagem de Tracy é profiling ao vivo, orientado a frame, instrumentado.
Recursos