Tracy Profiler - Cheatsheet del Profiler di Frame in Tempo Reale
Tracy è un profiler ibrido di frame e sampling in tempo reale con risoluzione nanosecondo, ampiamente utilizzato nei giochi e in C++ e Rust a bassa latenza. Aggiungi macro zone leggere al tuo codice e Tracy trasmette i dati di timing live a un”interfaccia desktop in cui puoi vedere ogni frame, ogni zona, timing GPU, allocazioni di memoria e contesa di blocchi mentre il programma gira. La sua combinazione di strumentazione manuale più campionamento automatico fornisce sia zone semantiche precise che hot spot non attribuiti.
Installation
| Component | How |
|---|
| Server (UI) | Build profiler/ dal repo o scarica un rilascio |
| Client (library) | Aggiungi TracyClient.cpp + header al tuo build |
| Rust | cargo add tracy-client (o tracing-tracy) |
| Enable | Compila con TRACY_ENABLE definito |
| Verify | Avvia l”UI; aspetta una connessione del client |
Instrumenting C++
#include "tracy/Tracy.hpp"
void update() {
ZoneScoped; // zone named after the function
physics();
}
void render() {
ZoneScopedN("Render Pass"); // explicit name
ZoneColor(0x00FF00);
draw();
}
int main() {
while (running) {
update();
render();
FrameMark; // marks a frame boundary
}
}
| Macro | Purpose |
|---|
ZoneScoped | Tempo l”ambito di inclusione |
ZoneScopedN("name") | Zona nominata |
ZoneText(str, len) | Allega testo a una zona |
FrameMark | Delimita i frame |
TracyPlot("fps", v) | Traccia un valore numerico nel tempo |
TracyMessage(...) | Registra un messaggio nella timeline |
TracyLockable(...) | Traccia la contesa di un mutex |
Instrumenting Rust
use tracy_client::{Client, span};
fn main() {
let _client = Client::start();
loop {
{
let _s = span!("update");
update();
}
tracy_client::frame_mark();
}
}
Oppure collegalo a tracing con il crate tracing-tracy in modo che gli span esistenti appaiano automaticamente in Tracy.
Memory & GPU
| Feature | How |
|---|
| Allocation tracking | TracyAlloc(ptr, size) / TracyFree(ptr) |
| Custom allocators | Avvolgi alloc/free con le macro |
| GPU zones (Vulkan/D3D/OpenGL) | TracyVkZone, TracyD3D12Zone, etc. |
| GPU context | Crea una volta, poi le zone si collegano ad essa |
The UI
| View | Shows |
|---|
| Timeline | Zone per thread, frame per frame |
| Statistics | Tempo aggregato per zona |
| Find zone | Istogramma delle durate di una zona |
| Compare | Differenza due catture (prima/dopo di un cambiamento) |
| Memory | Timeline di allocazione e perdite |
| Locks | Contesa tra thread |
| Flame graph | Struttura di chiamata aggregata |
Workflow: Chasing a Frame Spike
| Step | Action |
|---|
| 1 | Esegui con il client collegato; riproduci il balbettio |
| 2 | Trova il frame lungo nella timeline |
| 3 | Zoom in — quale zona domina? |
| 4 | Apri “Find Zone” per quella zona → istogramma di durata |
| 5 | Controlla il contesto dell”outlier (blocchi, allocazioni, GPU wait) |
| 6 | Correggi, cattura di nuovo, usa Compare per provare il miglioramento |
Quel flusso di lavoro compare-two-captures è una delle caratteristiche più pratiche di Tracy — trasforma “sembra più veloce” in un delta misurato.
Sampling Mode
Oltre alle zone manuali, Tracy può campionare automaticamente gli stack di chiamate (Linux/Windows), catturando il tempo nel codice che non hai strumentato. Combinali entrambi: le zone danno struttura semantica, il campionamento riempie i vuoti.
| Aspect | Tracy | perf | Perfetto |
|---|
| Model | Zone strumentate + campionamento | Campionamento | Tracing di sistema |
| Resolution | Nanosecondo | Intervallo di campione | Livello di evento |
| Live view | Sì (in tempo reale) | No | Post-hoc |
| GPU support | Integrato | No | Parziale |
| Best for | Giochi, frame-based, C++/Rust a bassa latenza | Percorsi caldi della CPU | Timeline di sistema intere |
Integra perf e Perfetto; il vantaggio di Tracy è il profiling live, orientato ai frame e strumentato.
Resources