Tracy Profiler - Profileur de frame temps réel
Tracy est un profileur hybrid frame et sampling temps réel à résolution nanosecondes, largement utilisé dans les jeux et le C++ et Rust à faible latence. Vous ajoutez des macros légères de zone à votre code, et Tracy diffuse les données de timing en direct à une UI de bureau où vous pouvez voir chaque frame, chaque zone, les timings GPU, les allocations mémoire, et la contention de verrous au fur et à mesure que le programme s’exécute. Sa combinaison d’instrumentation manuelle plus l’échantillonnage automatique donne à la fois des zones sémantiques précises et des points chauds non attribués.
Installation
| Composant | Comment |
|---|
| Serveur (UI) | Construire profiler/ depuis le repo ou télécharger une release |
| Client (bibliothèque) | Ajouter TracyClient.cpp + headers à votre build |
| Rust | cargo add tracy-client (ou tracing-tracy) |
| Activer | Compiler avec TRACY_ENABLE défini |
| Vérifier | Lancer l’UI ; elle attend une connexion client |
Instrumenter C++
#include "tracy/Tracy.hpp"
void update() {
ZoneScoped; // zone nommée d'après la fonction
physics();
}
void render() {
ZoneScopedN("Render Pass"); // nom explicite
ZoneColor(0x00FF00);
draw();
}
int main() {
while (running) {
update();
render();
FrameMark; // marque une limite de frame
}
}
| Macro | Objectif |
|---|
ZoneScoped | Chronométrer la portée englobante |
ZoneScopedN("name") | Zone nommée |
ZoneText(str, len) | Joindre du texte à une zone |
FrameMark | Délimiter les frames |
TracyPlot("fps", v) | Tracer une valeur numérique au fil du temps |
TracyMessage(...) | Enregistrer un message dans la chronologie |
TracyLockable(...) | Suivre la contention d’un mutex |
Instrumenter Rust
use tracy_client::{Client, span};
fn main() {
let _client = Client::start();
loop {
{
let _s = span!("update");
update();
}
tracy_client::frame_mark();
}
}
Ou l’intégrer à tracing avec la crate tracing-tracy afin que les spans existantes apparaissent automatiquement dans Tracy.
Mémoire et GPU
| Caractéristique | Comment |
|---|
| Suivi d’allocation | TracyAlloc(ptr, size) / TracyFree(ptr) |
| Allocateurs personnalisés | Envelopper alloc/free avec les macros |
| Zones GPU (Vulkan/D3D/OpenGL) | TracyVkZone, TracyD3D12Zone, etc. |
| Contexte GPU | Créer une fois, puis les zones s’y attachent |
L’UI
| Vue | Affiche |
|---|
| Chronologie | Zones par thread, frame par frame |
| Statistiques | Temps agrégé par zone |
| Trouver zone | Histogramme des durées d’une zone |
| Comparer | Diff deux captures (avant/après un changement) |
| Mémoire | Chronologie d’allocation et fuites |
| Verrous | Contention entre threads |
| Graphique de flamme | Structure d’appel agrégée |
Workflow : Chasser un pic de frame
| Étape | Action |
|---|
| 1 | Exécuter avec le client connecté ; reproduire la saccade |
| 2 | Trouver le frame long dans la chronologie |
| 3 | Zoomer — quelle zone domine ? |
| 4 | Ouvrir « Trouver zone » pour cette zone → histogramme de durée |
| 5 | Vérifier le contexte du pic (verrous, allocations, attente GPU) |
| 6 | Corriger, capturer à nouveau, utiliser Comparer pour prouver l’amélioration |
Ce workflow de comparaison de deux captures est l’une des caractéristiques les plus pratiques de Tracy — il transforme « se sent plus rapide » en un delta mesuré.
Mode d’échantillonnage
Au-delà des zones manuelles, Tracy peut échantillonner les piles d’appels automatiquement (Linux/Windows), attrapant le temps dans le code que vous n’avez pas instrumenté. Combiner les deux : les zones donnent la structure sémantique, l’échantillonnage remplit les lacunes.
Tracy vs profileurs connexes
| Aspect | Tracy | perf | Perfetto |
|---|
| Modèle | Zones instrumentées + échantillonnage | Échantillonnage | Traçage système |
| Résolution | Nanosecondes | Intervalle d’échantillonnage | Au niveau des événements |
| Vue live | Oui (temps réel) | Non | Post-hoc |
| Support GPU | Intégré | Non | Partiel |
| Meilleur pour | Jeux, frame-based, C++/Rust à faible latence | Chemins chauds CPU | Chronologies système |
Complète perf et Perfetto ; l’avantage de Tracy est le profilage live, orienté frame, instrumenté.
Ressources