MicroProfilerは、Roblox StudioおよびRobloxクライアントにおけるパフォーマンス最適化とトラブルシューティングツールです。アニメーションキャラクター、物理更新、スクリプト実行、ジオメトリレンダリングなど、フレーム中に実行されるすべてのエンジンタスクに関する詳細で視覚的なタイミング情報を提供します。どのタスクがどのフレームで実行されたか、これらのタスクがどれくらいの時間を要したか、そしてそれらがフレームタイムの目標を達成するのを妨げたかどうかを特定できます。
フレームタイム
MicroProfilerを使用するには、フレームタイムとフレームレートの関係を理解する必要があります。
- フレームタイムとは、画面にフレームをレンダリングするのにかかる時間であり、通常はミリ秒で測定されます。
- フレームレートとは、画面にレンダリングされるフレームの数であり、通常はフレーム毎秒(FPS)で測定されます。
フレームタイムが低ければ、フレームレートは高くなります。1,000ミリ秒(1秒)をフレームタイムで割ることでフレームレートを導き出せます。
| 平均フレームタイム | フレーム毎秒 |
|---|---|
| 33.33 ms | 30 FPS |
| 16.67 ms | 60 FPS |
| 8.33 ms | 120 FPS |
| 4.17 ms | 240 FPS |
滑らかなゲームプレイを実現するには、高いフレームレートを維持するだけでは不十分です。一貫したフレームタイムが必要です。たとえば、60フレームが10ミリ秒で到着し、1フレームが410ミリ秒で到着した場合、プレイヤーは60 FPSでゲームが動いているにもかかわらず、大きな衝撃的なスタッターを感じます。すべてのフレームがほぼ同じ時間でレンダリングされると、一貫性によりゲームは感覚的に滑らかに感じられます。特に低フレームレートの時にそうです。
MicroProfilerはフレームタイムに完全に焦点を当てています。その目的は、フレームタイムのスパイクとその原因を特定するのを助けることです。
MicroProfilerを開く
MicroProfilerを開く方法はプラットフォームによって異なります:
モバイルクライアントでは、設定メニューを開き、MicroProfilerをオンにします。次に、開発マシンで同じネットワーク上にある場合、ウェブブラウザーを使用して提供されたIPアドレスとポートに移動します。

このスクリーンショットは、IPアドレスが172.18.56.105でポートが1338であることを示しているので、172.18.56.105:1338に移動します。デバイスのネットワーク構成により、複数のIPアドレスが表示される場合があります。うまくいかなければ、次のアドレスを試してください。
デスクトップクライアントでは、CtrlF6(⌘F6)を押します。
スタジオでは、CtrlF6(⌘F6)を押します。
一般的に、モバイルクライアントはゲームをプロファイリングするのに最適な場所です。Robloxのプレイヤーのほとんどが携帯電話やタブレットを使用しており、これらのデバイスはパフォーマンスを制限する厳しい熱的および電力の制約があります。もしあなたのゲームが中程度のAndroidタブレットでうまく動作する場合、ゲーミングデスクトップでそれよりもはるかに優れたパフォーマンスを示すことがほぼ確実です。
MicroProfilerの基本
MicroProfilerには、2つの主要なコンポーネントがあります:フレームタイムバーグラフと詳細なタスクタイムライン。
- フレームタイムグラフはインターフェースの上部にあり、各フレームのレンダリングにかかった時間を示します。バーが高いほど、フレームタイムは長くなります。
- タイムラインは、フレーム中に実行されたすべての個々のタスクを示します。バーが広いほど、実行に時間がかかったタスクを示します。
MicroProfilerでの典型的なワークフローは、フレームタイムグラフを使用してスパイク(高いバー)を特定し、次にタイムラインを使用してどのタスクがスパイクを引き起こしたかを確認することです。次に、タグ参照を確認してタスクに関する情報とそのパフォーマンスを改善する方法を探ります。

フレームタイムグラフ
各バーの高さは、そのフレームを完了するのにかかったミリ秒数を示します。最近のフレームは右側にあります。フレームにカーソルを合わせると、CPUおよびGPU使用率に関する基本情報が表示されます。

オレンジのバーは、ジョブの壁時間がレンダーの壁時間を超えているフレームです。これらのフレームでは、スクリプトを実行したり、物理計算やアニメーションを再生するようなワーカースレッドの1つ以上が、メインレンダースレッドの実行時間を超えるのに時間がかかりました。
ゲームがフレームタイムの目標に達しておらず、大量のオレンジのフレームがある場合、一般的な原因はスクリプト、物理、アニメーションです。パフォーマンスを改善するを参照してください。
青のバーは、レンダーの壁時間がジョブの壁時間を超えているフレームです。これらのフレームでは、メインレンダースレッドがどのワーカースレッドよりも多くの時間を要しました。
ゲームがフレームタイムの目標に達しておらず、大量の青のフレームがある場合、それはレンダリングのボトルネックを示します。一般的な原因は過剰なオブジェクト密度、オブジェクトの動き、ライティングです。パフォーマンスを改善するを参照してください。
赤のバーは、次の2つの条件が真であるフレームです:
- レンダーの壁時間がジョブの壁時間を超える
- GPU待機時間が2.5ミリ秒を超える
赤のバーはオレンジや青よりも一般的ではなく、しばしば過剰なオブジェクトの複雑さ、テクスチャサイズ、ビジュアルエフェクトの結果です。最適化は青のバーと似た方法です。パフォーマンスを改善するを参照してください。
フレームの最後の小さなタスクは、時々ジョブの壁時間とレンダーの壁時間を狂わせることがあるため、フレームの色よりもフレームタイムにもっと焦点を当てるのが良い理由です。"良い"色を目指すことはありません。オレンジ、青、赤の混合がフレームタイムの目標に到達していれば問題ではありません。もしあなたがフレームタイムの目標に達していない場合、色が最適化の手がかりを示すことがあります。
タイムライン
左クリックしてドラッグすることでタイムラインをパンします。多くのCPUコアを持つマシンでは、特定のタスクを実行しているスレッドを見つけるためにはかなり上下にパンする必要があるかもしれません。

スクロールすることでタイムラインをズームインおよびズームアウトできます。タイムラインの上部にあるミリ秒ラベルと組み合わせることで、タスクが絶対的にどれくらいの時間を要したか、また、他のタスクに対してどれくらいの時間を要したかの感覚を得ることができます。

バーグラフ上の緑のオーバーレイは、タイムラインで現在表示されているフレームの数、つまりズームレベルを示します。フレームバーデータを左クリックすると、その位置にタイムラインがジャンプします。
ズームレベルを調整する必要があるかもしれませんが、バーにカーソルを合わせるとタイムラインのフレームがハイライトされます。薄い灰色の線がフレームを区切ります。

別のラベルの直下に表示されるラベルは、上位のタスクの一部として実行されるタスクを示します。
親タスクではなく、通常は最悪のパフォーマンスの子タスクをトラブルシューティングしたいです。親タスクの時間はその子タスクの合計時間よりも短くなりません。
ラベルを右クリックすると、そのタスクの正確な期間までタイムラインをズームします。
情報量が多すぎて圧倒されている場合は、グループやスレッドメニューを使用してタイムラインをフィルタリングしてください。たとえば、メインスレッドのレンダタスクのみを表示したいかもしれません。

CtrlF(⌘F)を使用して、ダンプ内で最も時間を要するタスクの出現にジャンプします。たとえば、computeLightingPerformは各クライアントフレームで実行されます。それが128フレームのダンプ内で最も長い時間を要するフレームにジャンプするために検索すれば、それに移動できます。
スレッド
多くのプログラムと同様に、Robloxは複数のスレッドを使用して同時にタスクのシーケンスを実行します。MicroProfilerは、タイムラインの左側にスレッド名を表示します。

重要なスレッドタイプは3つあります:
メイン("RBX Main"):CPUベースのレンダリングタスクを処理します。入力、Humanoids、アニメーション/ツイーニング、物理の所有権、サウンド、スクリプトの再開を待機します。また、スタジオインターフェースを更新し、他のスレッドの調整を行います。
ワーカー("RBX Worker"):ネットワーキング、物理、経路探索においてメインスレッドを支援します。現代のCPUのコア数により、一般的に多くのワーカースレッドが存在し、その大部分は常に睡眠状態です。
レンダー("GPU"):"準備、実行、提示"のロジックに従います。デバイスのグラフィックス処理ユニット(GPU)と通信します。
- 準備:メインスレッドからの情報を使用してレンダリングモデルを更新します。
- 実行:2Dインターフェースを含むレンダリングコマンドを発行します。
- 提示:GPUとの同期を行います。
カスタムスクリプトプロファイル
スクリプトが複雑なタスクを実行している場合、コードの重要な部分をプロファイリングして、時間がかかりすぎていないかを確認できます。debug.profilebegin()とdebug.profileend()でコードをラップして、それらの関数呼び出しの間に実行されたすべての時間を計測し、MicroProfilerタイムラインにラベルを作成します。
local RunService = game:GetService("RunService")
local function onPreSimulation()
debug.profilebegin("Hard Work")
-- 例:2つの変数を20万回交換
local a, b = 0, 1
for _ = 1, 200000 do
a, b = b, a
end
debug.profileend()
end
RunService.PreSimulation:Connect(onPreSimulation)
タイムライン上の持続時間から、その関数は他のタスクに比べて多くの処理時間を使用していることがわかります。
アシスタントを使用したキャプチャの分析
スタジオでは、アシスタントに一時停止したMicroProfilerキャプチャを自動的に分析させ、パフォーマンスのボトルネックを特定し、修正提案を行うように依頼できます。
- スタジオで、CtrlF6(⌘F6)を押してMicroProfilerを開きます。
- フレームタイムのスパイクを確認したら、一時停止ボタンを押すか、CtrlP(⌘P)を使用してキャプチャを一時停止します。
- アシスタントを開き、キャプチャを分析するように依頼します。例文には以下が含まれます:
- "MicroProfilerでキャプチャしたフレームタイムのスパイクを分析してください。"
- "スパイクの原因は何ですか?"
- "物理に制約されているのか、スクリプトに制約されているのか?"
- "どのカテゴリに最も多くの独占時間がありますか?"
- "ハンガーにいるとき、FPSが落ちます。この問題を再現し、MicroProfilerを使用して原因を特定して修正し、再テストしてください。"
アシスタントはMicroProfiler APIを介して一時停止したキャプチャを読み取り、考えられるボトルネックについてのレポートを返し、適用できるスクリプトやシーンの変更を提案します。
この機能は、Studio MCPサーバーでも動作するため、MicroProfilerの分析を独自のAIエージェントやエージェントループに統合して、新しい変更がゲームのパフォーマンスに与える影響に関する自動フィードバックを得ることができます。
フレームデータを保存
後でレビューするためにフレームデータのセットを保存したい場合(または他の誰かと共有するために)、ファイルに保存ボタンを使用します。MicroProfilerは、microprofile-<date>-<time>.htmlという名前のスタンドアロンHTMLファイルにフレームデータを保存します。

デスクトップクライアントまたはスタジオでは、ダンプメニューを使用します。どちらの場合も、MicroProfilerは自動的にファイルをRobloxログディレクトリに保存します:
Windowsでは、%LOCALAPPDATA%\Roblox\logsを確認します。
Universal Windows Platform(UWP)アプリを使用している場合は、\Users\<username>\AppData\Local\Packages\ROBLOXCORPORATION.ROBLOX_<hash>\LocalState\logs\を確認してください。
macOSでは、~/Library/Logs/Robloxを確認します。
サーバーのプロファイリング
クライアントをプロファイルするだけでなく、サーバーアクティビティの短いダンプをキャプチャすることもできます。
デスクトップクライアントで、編集権限を持つゲームに参加します。
CtrlF9(⌘F9)でデベロッパーコンソールを開きます。
ドロップダウンメニューからMicroProfilerを選択します。
サーバータブで、キャプチャするフレームの数(最大60)とキャプチャを開始する前の遅延時間(最大4秒)を指定します。
ウェブのみの機能
MicroProfilerには、ウェブUI(モバイルおよびダンプ)とデスクトップUI(クライアントおよびスタジオ)の2つのユーザーインターフェースがあります。可能な限りウェブUIを使用することをお勧めします。一般的に、両者は同様に機能しますが、ウェブUIにはいくつかの追加機能があります:
X-Rayメニューを使用して、メモリアロケーションの色分けを有効または無効にします。

- メインバーグラフ内の明るいフレームは、高いメモリアロケーションを示します。
- プレビューバーの明るい部分やタイムラインの明るいラベルは、フレーム内の高いメモリアロケーションの部分を示します。
- X-Rayモードでは、Cを押すと、アロケーション数ではなくメモリアロケーションの合計サイズを表示します。
エクスポートメニューを使用して、CPUまたはメモリのフレームグラフをエクスポートします。これは、ダンプに含まれるすべての呼び出しスタックを集約し、親-子階層を維持し、持続時間に基づいてサイズを決定する特化したビジュアライゼーションです。フレームグラフは、フレームタイムの目標を逃さないタスク(そのため認識しにくい)を特定するのに特に有用ですが、非常に頻繁に実行されるタスクの処理時間が重要なものになります。

スタジオでもスクリプト(実行時間とメモリアロケーション)に対するフレームグラフを作成できます。ウェブベースのフレームグラフに比べて、スタジオのフレームグラフはトップダウン方式で、ボトムアップではなく、はるかに長いキャプチャ時間をサポートしています。

ウェブUIに2つ目のダンプファイルをドラッグアンドドロップして、diffフレームグラフを生成できます。これにより、時間の経過とともにゲームのパフォーマンスの改善や後退を特定できます。結合と比較をクリックして新しいHTMLファイルをエクスポートします。

diffフレームグラフでは、CPUまたはメモリをより消費しているダンプ(左側または右側)が強調表示され、明るい色が大きな差を示します。

デスクトップのみの機能
デスクトップタイムラインで、左クリックしてラベルを追加すると、右下の折れ線グラフに追加されます。このグラフは、各フレームのタスクにかかる時間を示します。このグラフを使用すると、ゲーム内の特定のタスクのパフォーマンスをテストできます。完了したら、グラフを右クリックして非表示にします。

このグラフは、メインプロファイラーのバーと同期しています。現在選択されているフレーム範囲は、グラフに緑でハイライト表示されます。このグラフ上の任意の場所をクリックすると、メインプロファイラービューがその特定のフレームに再センターされ、詳細表示でスパイクを見つけるのに役立ちます。
