Tracy プロファイラー - リアルタイムフレームプロファイラー チートシート
Tracy はリアルタイム、ナノ秒解像度ハイブリッドフレーム・サンプリングプロファイラーで、ゲームと低遅延 C++ と Rust で広く使用されます。コードに軽量なゾーンマクロを追加し、Tracy はタイミングデータをデスクトップ UI にライブストリームします。プログラムの実行中に、すべてのフレーム、すべてのゾーン、GPU タイミング、メモリ割り当て、ロック競合が見えます。手動インストルメンテーション と自動サンプリングの組み合わせは、正確なセマンティックゾーンと帰属しないホットスポットの両方を提供。
インストール
| コンポーネント | 方法 |
|---|
| サーバー (UI) | リポジトリから profiler/ をビルドまたはリリースをダウンロード |
| クライアント (ライブラリ) | ビルドに TracyClient.cpp + ヘッダーを追加 |
| Rust | cargo add tracy-client (または tracing-tracy) |
| 有効化 | TRACY_ENABLE を定義して コンパイル |
| 確認 | UI を起動; クライアント接続を待つ |
C++ をインストルメント化
#include "tracy/Tracy.hpp"
void update() {
ZoneScoped; // 関数名のゾーン
physics();
}
void render() {
ZoneScopedN("Render Pass"); // 明示的な名前
ZoneColor(0x00FF00);
draw();
}
int main() {
while (running) {
update();
render();
FrameMark; // フレーム境界をマーク
}
}
| マクロ | 目的 |
|---|
ZoneScoped | 囲むスコープ時間 |
ZoneScopedN("name") | 名前付きゾーン |
ZoneText(str, len) | ゾーンにテキストを付加 |
FrameMark | フレームを区切る |
TracyPlot("fps", v) | 時間経過による数値プロット |
TracyMessage(...) | タイムラインにメッセージをログ |
TracyLockable(...) | ミューテックスの競合を追跡 |
Rust をインストルメント化
use tracy_client::{Client, span};
fn main() {
let _client = Client::start();
loop {
{
let _s = span!("update");
update();
}
tracy_client::frame_mark();
}
}
または tracing-tracy クレートで tracing にワイア。既存のスパン自動的に Tracy に表示されます。
メモリ & GPU
| 機能 | 方法 |
|---|
| 割り当て追跡 | TracyAlloc(ptr, size) / TracyFree(ptr) |
| カスタムアロケーター | alloc/free をマクロでラップ |
| GPU ゾーン (Vulkan/D3D/OpenGL) | TracyVkZone、TracyD3D12Zone など |
| GPU コンテキスト | 一度作成、次でゾーン添付 |
UI
| ビュー | 表示 |
|---|
| タイムライン | スレッド別ゾーン、フレーム別 |
| 統計 | ゾーン別集計時間 |
| ゾーンを検索 | 1 つのゾーン期間のヒストグラム |
| 比較 | 2 つのキャプチャを diff (変更前/後) |
| メモリ | 割り当てタイムラインと漏洩 |
| ロック | スレッド間の競合 |
| フレームグラフ | 集計呼び出し構造 |
ワークフロー: フレームスパイクを追跡
| ステップ | アクション |
|---|
| 1 | クライアント接続で実行; ヒッチを再現 |
| 2 | タイムラインで長いフレームを見つける |
| 3 | ズーム — どのゾーンが支配? |
| 4 | そのゾーンの「ゾーン検索」を開く → 期間ヒストグラム |
| 5 | アウトライアーのコンテキストをチェック (ロック、割り当て、GPU 待機) |
| 6 | 修正、再度キャプチャ、比較で改善を証明 |
2 つのキャプチャを比較するワークフローは Tracy の最も実用的な機能の 1 つです。「より速く感じる」を測定デルタに変えます。
サンプリングモード
手動ゾーン以外、Tracy は自動的にコールスタックをサンプリングできます (Linux/Windows)、インストルメント化しなかったコード内の時間をキャッチ。両方を組み合わせます: ゾーンはセマンティック構造を与え、サンプリングがギャップを埋めます。
Tracy 対 関連プロファイラー
| 側面 | Tracy | perf | Perfetto |
|---|
| モデル | インストルメント化ゾーン + サンプリング | サンプリング | システム全体トレーシング |
| 解像度 | ナノ秒 | サンプル間隔 | イベントレベル |
| ライブビュー | はい (リアルタイム) | いいえ | ポスト hoc |
| GPU サポート | 組み込み | いいえ | 部分的 |
| 最適用途 | ゲーム、フレームベース、低遅延 C++/Rust | CPU ホットパス | システム全体タイムライン |
perf と Perfetto を補完; Tracy のエッジはライブ、フレーム指向、インストルメント化プロファイリング。
リソース