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

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

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

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

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

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

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

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

重要なスレッドタイプは3つあります:
メイン("RBX Main"):CPUベースのレンダリングタスクを処理します。入力、Humanoids、アニメーション/ツイーニング、物理の所有、サウンド、スクリプトの再開を待機します。また、スタジオインターフェイスを更新し、他のスレッドを調整します。
ワーカー("RBX Worker"):メインスレッドをネットワーキング、物理学、経路探索を助けます。現代のCPUには多くのコアがあるため、多くのワーカースレッドが存在し、ほとんどは常にスリープ状態です。
レンダリング("GPU"):"準備、実行、提示"のロジックに従います。デバイスのグラフィックスプロセッシングユニット(GPU)と通信します。
- 準備:メインスレッドの情報が使用されてレンダリングモデルが更新されます。
- 実行:レンダリングコマンドを発行し、2Dインターフェイスを含みます。
- 提示:GPUと同期します。
カスタムスクリプトプロファイル
スクリプトが複雑なタスクを実行している場合、コードの重要な部分をプロファイルして、長すぎないことを確認できます。debug.profilebegin()とdebug.profileend()を使用してコードをラップし、これらの関数呼び出しの間に行われたすべての時間を測定し、マイクロプロファイラータイムラインにラベルを作成します。
local RunService = game:GetService("RunService")
local function onPreSimulation()
debug.profilebegin("Hard Work")
-- 例のハードワーク:2つの変数を200,000回入れ替える
local a, b = 0, 1
for _ = 1, 200000 do
a, b = b, a
end
debug.profileend()
end
RunService.PreSimulation:Connect(onPreSimulation)

タイムラインでのその継続時間から、その関数が他のタスクと比較してかなりの処理時間を使用していることが分かります。
フレームデータを保存する
後でレビューする(または他の人と共有する)ためにフレームデータのセットを保存したい場合は、ファイルに保存ボタンを使用します。マイクロプロファイラーは、microprofile-<date>-<time>.htmlという名前の独立したHTMLファイルにフレームデータを保存します。

デスクトップクライアントまたはスタジオでは、ダンプメニューを使用します。どちらの場合も、マイクロプロファイラーは自動的にそのファイルを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)で開発者コンソールを開きます。
ドロップダウンメニューからマイクロプロファイラーを選択します。
サーバータブで、キャプチャするフレームの数(最大60)と、キャプチャを開始する前の遅延秒数(最大4)を指定します。
サーバー記録を開始をクリックします。

数秒後、開発者コンソールは、標準のダンプと同じパスを提供します。
ウェブ専用機能
マイクロプロファイラーには、ウェブUI(モバイルおよびダンプ用)とデスクトップUI(クライアントおよびスタジオ用)の2つのユーザーインターフェースがあります。可能な限りウェブUIを使用することをお勧めします。一般に、2つは似たように機能しますが、ウェブUIにはいくつかの追加機能があります:
X-Rayメニューを使用して、メモリ割り当ての色分けを有効または無効にします。

- メインバーメトリクス内の明るいフレームは、より高いメモリ割り当てを示します。
- プレビューバーの明るい部分およびタイムラインの明るいラベルは、フレームのメモリ割り当てが高い部分を示します。
- X-Rayモードでは、Cを押すと、割り当ての合計サイズが表示され、割り当ての数が表示されなくなります。
エクスポートメニューを使用して、CPUまたはメモリフレームグラフをエクスポートします。これは、ダンプに含まれるすべてのコールスタックを集約し、親子階層を維持し、持続時間に基づいてサイズを調整する特殊な視覚化です。フレーム時間の目標を逃さないタスクを特定するのに特に役立つ、あまり気づかれないが、非常に頻繁に実行されるタスクの処理時間が重要になります。

スタジオでもフレームグラフを作成できますが、スクリプト(実行時間とメモリ割り当て)のみです。ウェブベースのフレームグラフと比較すると、スタジオのものはボトムアップではなくトップダウンで、長時間のキャプチャがサポートされています。

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

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

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

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