Aller au contenu

Tracy Profiler - Profileur de frame temps réel

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

ComposantComment
Serveur (UI)Construire profiler/ depuis le repo ou télécharger une release
Client (bibliothèque)Ajouter TracyClient.cpp + headers à votre build
Rustcargo add tracy-client (ou tracing-tracy)
ActiverCompiler avec TRACY_ENABLE défini
VérifierLancer 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
    }
}
MacroObjectif
ZoneScopedChronométrer la portée englobante
ZoneScopedN("name")Zone nommée
ZoneText(str, len)Joindre du texte à une zone
FrameMarkDé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éristiqueComment
Suivi d’allocationTracyAlloc(ptr, size) / TracyFree(ptr)
Allocateurs personnalisésEnvelopper alloc/free avec les macros
Zones GPU (Vulkan/D3D/OpenGL)TracyVkZone, TracyD3D12Zone, etc.
Contexte GPUCréer une fois, puis les zones s’y attachent

L’UI

VueAffiche
ChronologieZones par thread, frame par frame
StatistiquesTemps agrégé par zone
Trouver zoneHistogramme des durées d’une zone
ComparerDiff deux captures (avant/après un changement)
MémoireChronologie d’allocation et fuites
VerrousContention entre threads
Graphique de flammeStructure d’appel agrégée

Workflow : Chasser un pic de frame

ÉtapeAction
1Exécuter avec le client connecté ; reproduire la saccade
2Trouver le frame long dans la chronologie
3Zoomer — quelle zone domine ?
4Ouvrir « Trouver zone » pour cette zone → histogramme de durée
5Vérifier le contexte du pic (verrous, allocations, attente GPU)
6Corriger, 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

AspectTracyperfPerfetto
ModèleZones instrumentées + échantillonnageÉchantillonnageTraçage système
RésolutionNanosecondesIntervalle d’échantillonnageAu niveau des événements
Vue liveOui (temps réel)NonPost-hoc
Support GPUIntégréNonPartiel
Meilleur pourJeux, frame-based, C++/Rust à faible latenceChemins chauds CPUChronologies système

Complète perf et Perfetto ; l’avantage de Tracy est le profilage live, orienté frame, instrumenté.

Ressources