プロファイラー
Turianにはエンジン内蔵プロファイラーが搭載されており、最適化を推測ではなくデータに基づいて行うことができます。これはゲームのプロファイラーであり——エンジンとスクリプトが行う作業を測定し、エディターのUIは測定しません——Turian Studio内でもビルド済みゲームでも動作します。
測定内容
- CPUゾーン——全スレッドにおけるネストされたスコープ付きタイマー。組み込みゾーンはGPUシーンレンダラー(
render.scene、render.upload、render.shadow、render.main)とスクリプト更新(scripts.update)をカバーします。独自のゾーンを追加することもできます。 - レンダーカウンター——フレームごとのドローコール、トライアングル、頂点、テクスチャバインド、マテリアル切り替え、作成されたテクスチャをGPUシーンレンダラーから直接収集します。
- フレームタイミング——フレームごとのウォールクロックCPU時間を、過去数秒間にわたってグラフ化します。
記録:プレイモードに連動
プロファイリングはプレイモードでのみ実行され、いつ実行するかを制御できます:
- ● 記録 / ❚❚ 一時停止 は、プレイ中にキャプチャを開始および一時停止します——実行の後半部分のみをプロファイリングしたい場合に便利です。
- プレイ時に自動記録(チェックボックス)は、再生ボタンを押した瞬間に記録を開始するか、記録ボタンを押すまで待つかを決定します。
- 停止を押すと、キャプチャされた履歴が凍結され、調査できるようになります。
アイドル状態のエディタービューポートは測定されないため、数値は常にゲームを反映します。ステータス行(● 記録中 / ❚❚ 一時停止中 / ■ アイドル)が現在の状態を表示します。
Studioパネル
表示 ▸ プロファイラーを表示(トグル)から開きます。フローティングパネルには以下が表示されます:
- 記録トランスポート、VSyncトグル、FPS上限セレクター(無制限 / 30 / 60 / 90 / 120)。VSyncは上限とは独立しています——モニターのリフレッシュレートを超える上限は、VSyncがオフの場合にのみ有効です。
- スクリーンショットをキャプチャおよびトレースをエクスポートボタン(以下参照)。
- フレーム時間チャート。固定0–50msスケールに60fpsと30fpsの基準線があり、フレームレートの変化がバーの高さに視覚的に反映されます。各バーは分割されています:下部のCPUビジー部分(60/30fps予算に収まるかどうかで青/黄/赤に色分け)と、上部のアイドル/キャップ待機部分(暗い灰色)。つまり、fpsを制限すると高くてほとんど灰色のバーになります——バーの高さは低いフレームレートを示しますが、コードが遅いわけではなく、キャップを待機しているだけなので赤くなりません。チャートをクリックまたはドラッグして、タイムラインの固定フレームをスクラブします。最新の列(または**● ライブ**)をクリックすると、最新フレームの追跡に戻ります。白いマーカーが固定/ライブフレームを示し、履歴セレクター(2秒/4秒/8秒)でスクラブ可能な範囲を設定します。
- タイムライン——中心となる要素。各スレッドがレーンになり、ネストされたゾーンは深さ方向に下に積み重なり、フレームの継続時間に比例して左から右に配置されます(フレームグラフのように)。ゾーンの色はフレーム間で安定しているため、スコープは監視中に色を維持します。タイムラインは固定されたフレームを表示するため、履歴をスクラブバックして任意のフレームで実行された内容を正確に検査できます。
- 表示フレームの**レンダリング(シーン)**カウンター。
- 折りたたみ可能な**エディターCPU(スタジオ)**セクション——エディター自身のフレームタイミング。ゲームのシーンメトリクスを前面に出し続けるためにしまわれています。
レンダラーはエディタービューポートと出荷ゲームの間で共有されるため、パネルに表示される数値はシーンのレンダリングにかかる実際のコストです。
分析用にエクスポート(Perfetto)
トレースをエクスポートは、記録された履歴をChrome/Perfettoトレースイベント形式で <project>/profiles/trace_NNNN.json に書き込みます。ui.perfetto.dev または chrome://tracing で開いて、フレーム間のゾーン分析、フレーム比較、本格的なツールを使ったフレームグラフの詳細調査が可能です。(Perfettoは分析側のツールであるため、トレースをStudioに再インポートする必要はありません。)
スクリーンショット
3Dビューポート(実際のGPUレンダリングシーン)を任意の瞬間にPNGとしてキャプチャします——レンダリングの不具合の発見、プロポーションの確認、チームメイトやAIアシスタントとのフレーム共有(PNGはどこでも開けます)に便利です。
- 表示 ▸ スクリーンショットをキャプチャ、またはプロファイラーパネルのスクリーンショットをキャプチャボタン。
- ファイルは
<project>/screenshots/shot_NNNN.pngに保存されます(次の空きインデックスが使用されるため、ショットが上書きされることはありません)。パネルが保存先のパスを報告します。
独自コードのプロファイリング
スクリプトの任意のセクションをスコープ付きゾーンでラップすると、タイムラインに表示されます:
const engine = @import("engine");
pub fn update(self: *@This(), frame: engine.Frame) void {
var z = engine.Profiler.zone("MyScript.heavyWork");
defer z.end();
// ... 負荷の高い処理 ...
}
ゾーンは自動的にネストされます:別のゾーン内で開かれたゾーンは、フレームグラフでその子ゾーンになります。
無効時のコスト
プロファイラーはデバッグビルドではデフォルトでオン、それ以外ではオフになっているため、出荷するリリースゲームはオプトインしない限りコストを支払いません:
engine.Profiler.enabled = true; // リリースビルドで有効化
無効の場合、すべてのエントリポイントは単一のブランチで早期復帰します。
ビルド済みゲームのプロファイリング
ビルド済みゲームも同じプロファイラーを実行します。生成されたゲームループは各フレームを Profiler.beginFrame/endFrame で括り、レンダラーとスクリプト更新ゾーンを記録します。画面上のオーバーレイHUD、フレームデータエクスポート(JSON/CSV)、およびオプションの Tracy 統合はロードマップに載っています(issue #35)。