Profiler ウィンドウ
Unity Profiler (プロファイラー) にアクセスするには、Window > Analysis > Profiler に移動するか、キーボードショートカット Ctrl+7 (macOS では Command+7 ) を使用します。
プロファイラーは、アプリケーションパフォーマンスの複数の領域を記録し、その情報を表示します。この情報を使用して、アプリケーションで何を最適化する必要があるかについて十分な情報に基づいた決定を行い、最適化によって期待する結果が得られることを確認できます。
By default, the Profiler records and keeps the last 300 frames of your game, and shows you detailed information about every frame. You can increase the number of frames it records in the Preferences window (menu: Edit > Preferences), up to 2,000 frames. Note: If you increase this setting to a large number of frames, the Profiler’s overhead and memory usage might become more performance intensive.
スクリプトコードと、そのコードをスローダウンさせる可能性のある特定のアセットとリソースをアプリケーションがどのように使用するかを調べることができます。また、さまざまなデバイスでアプリケーションのパフォーマンスを比較することもできます。プロファイラーにはいくつかの異なる プロファイラーモジュール があり、プロファイリングセッションに追加して、レンダリング、メモリ、 オーディオなどの領域に関する詳細情報を取得できます。
このページでは、以下のトピックについて説明します。
Profiler ウィンドウは以下のようにレイアウトされています。
Preferences ウィンドウには、以下のような Profiler ウィンドウの追加設定があります。
設定 | 説明 |
---|---|
Frame count | プロファイラーがキャプチャするフレームの最大数を設定します。300 - 2,000 の間で設定できます。 |
Show stats for ‘current frame’ | デフォルトでは、Current Frame ボタンを選択して Current Frame モードに入ると、フレームインジケーターラインは現在のフレームの統計情報の注釈を持たなくなります。これは、統計情報の注釈を使用すると、データをリアルタイムで表示することが難しくなる場合があるためです。注釈を表示するには、この設定を有効にします。 |
Default recording state | プロファイラーをどのような記録状態で開くかを選択します。Enabled、Disabled、Remember から選択します。Enabled は、セッションの合間も Record ボタンを有効にしたままにし、Disbled は、プロファイリングセッション中の有効/無効の設定に関わらず、無効にします。Remember の状態は、セッション中に Record ボタンを有効にしたか無効にしたかを記憶し、次回 Profiler ウィンドウを開いたときに、その状態を維持します。 |
Default editor target mode | Attach to Player ドロップダウンがデフォルトで対象とするモードを選択します。Playmode または Editor のいずれかを選択します。 |
プロファイラーのコントロールは、Profiler ウィンドウ上部のツールバーにあります。これらを使用して、 プロファイラーデータのレコーディングを開始または停止し、プロファイリングされたフレームをナビゲートします。
制御 | 機能 | |
---|---|---|
プロファイリングターゲット | アプリケーションをどのターゲットでプロファイルするかを選択します。デフォルトでは、 Playmode に設定されています。また、 Editor を選択すると、Unity エディターをプロファルし、エディターが現在使用しているリソースを表示します。 また、Unity は、ネットワーク上で動作しているデバイスや、USB で接続されているデバイスを自動的に検出し、ドロップダウンに表示します。 Enter IP をドロップダウンでクリックして、アプリケーションをプロファイルするデバイスの IP アドレスを手動で入力します。詳しくは、アプリケーションのプロファイリング を参照してください。 |
|
記録 | これをクリックすると、アプリケーションの実行時にアクティブなモジュールのプロファイリング情報が記録されます。このボタンを有効にしないと、アプリケーションを実行してもプロファイラーはデータを収集しません。 | |
戻る | 1 フレーム前に戻ります。 | |
進む | 1 フレーム先に進みます。 | |
Current Frame (現在のフレーム) | Current Frame ボタンをクリックすると、フレームインジケーターのラインが最後に記録されたフレームにジャンプし、プロファイラーは Current Frame (現在のフレーム) モードに入ります。プロファイラーはこのモードでデータを収集しながら、現在のフレームに留まり、収集したデータをリアルタイムで表示します。もう一度ボタンをクリックすると、Current Frame モードが終了します。 | |
フレーム番号 | 現在、見ているフレーム番号をプロファイラーに示します。左側の数字は現在選択されているフレーム、右側の数字はプロファイリングセッション全体でプロファイラーが収集したフレームの合計数です。 | |
Clear | Profiler ウィンドウからすべてのデータを消去します。 | |
Clear on Play | これを有効にすると、次に Player ウィンドウで再生ボタンをクリックしたとき、または新しいターゲット デバイスに接続したときに、Profiler ウィンドウからすべてのデータが消去されます。 | |
Deep Profile | すべての C# メソッドをプロファイリングするには、この設定を有効にします。この設定を有効にすると、Unity はすべての mono 呼び出しにインストルメンテーションを加えます。これにより、スクリプトのより詳細な調査が可能になります。詳細は ディーププロファイリング を参照してください。 | |
Call Stacks | スクリプトのメモリ割り当てのコールスタックを記録するには、このトグルをクリックします。このオプションを有効にすると、ディーププロファイリング がアクティブでない場合でも、プロファイラーが記録するフレームには、フルコールスタック (マネージスクリプティングの割り当てをします) で選択されたサンプルに関する情報が含まれます。デフォルトでは、この設定を有効にすると、プロファイラーは GC.Alloc サンプルのフルコールスタック情報を記録しますが、ドロップダウンで別のサンプル (UnsafeUtility.Malloc、JobHandle.Complete、Native Allocations)。詳細については、CPU Usage Profiler モジュールページのコールスタックの割り当て セクションを参照してください。 | |
Load (ロード) | 保存したプロファイラーデータを Profiler ウィンドウにロードします。プレイヤーが Profiler.logFile API を通してファイルに書き出したバイナリプロファイルデータをロードすることもできます。 Shift ボタンを押しながら Load ボタンをクリックすると、ファイルのコンテンツを現在のプロファイルフレームに追加できます。 |
|
保存 | プロファイラーデータを Project フォルダーの .data ファイルに保存します。 | |
コンテキストメニュー | ||
Color Blind Mode | この設定を有効にすると、プロファイラーのグラフでコントラストの高い色が使用されます。これは、赤緑色覚異常 (例えば、先天赤緑異常、1 型 2 色覚異常、3 型 2 色覚異常) のユーザーのための可視性を向上させます。 | |
Show stats for “current” frame | デフォルトでは、Current Frame ボタンを選択して Current Frame モードに入ると、フレームインジケーターラインは現在のフレームの統計情報の注釈を持たなくなります。これは、統計情報の注釈を使用すると、データをリアルタイムで表示することが難しくなる場合があるためです。注釈を表示するには、この設定を有効にします。 | |
Preferences | Preferences メニューを開くと、プロファイラー固有のプロパティを調整できます。 |
オーバーヘッドを低く維持するために、Unity はエディター UI の 5 フレームごとに再描画します。これにより、少しぎこちない更新になります。
通常、プロファイラーは、ProfilerMarkers に明示的に包まれているコード部分をプロファイリングします。これには、エンジンのネイティブ コードからスクリプトコードへの呼び出し (例えば、MonoBehaviour
の Start
、Update
、または類似のメソッドなど) の最初のコールスタックの深さが含まれます。
独自のコードにさらに明示的な ProfilerMarker
インストルメンテーションを加えなくても、スクリプトコードの子サンプルとして表示できる他のサンプルは、その API がインストルメント化されている場合に、Unity の API にコールバックできるサンプルのみです。パフォーマンスのオーバーヘッドを伴うほとんどの API 呼び出しはインストルメント化されています。例えば、Camera.main
API を通してメインカメラにアクセスすると、FindMainCamera
サンプルとして記録されます。
Deep Profile 設定を有効にすると、プロファイラーはスクリプトコードのすべての部分をプロファイリングし、少なくとも最初のコールスタックの深さを含むすべての関数呼び出しを Unity API に記録します。これは、コードがアプリケーションのパフォーマンスに影響を与える箇所を改善するのに役立つ情報ですが、オーバーヘッドが増加します。
アプリケーションにディーププロファイリングを行うと、Unity はすべてのスクリプトメソッドにプロファイラーのインストルメンテーションを挿入し、すべての関数呼び出しをレコードします。これは、アプリケーションコードが最も時間を費やす場所を理解するのに役立ちます。
ディーププロファイリングはリソースを大量に消費し、多くのメモリを使用します。結果として、プロファイリング中はアプリケーションの実行が著しく遅くなります。ディーププロファイリングは、簡単なスクリプトで動く小さなゲームに適しています。複雑なスクリプトコードを使用している場合、アプリケーションでディーププロファイリングをまったく使用できない場合があります。また、大きなアプリケーションの多くでは、ディーププロファイリングによって Unity のメモリが不足する場合があります。
プロファイラーにサンプルを流すためのリングバッファに保存するには、サンプルが多すぎるという問題が発生した場合、Unity はエラーメッセージを表示します。リングバッファのサイズを増やすには、プロファイリングするプレイヤーの Profiler.maxUsedMemory プロパティを調整します。
ディーププロファイリングによってアプリケーションのフレームレートが大幅に低下し、実行が不可能にな場合は、スクリプトコードのブロックを手動でプロファイリングできます。これにより、ディーププロファイリングよりオーバーヘッドが小さくなります。ProfilerMarkers を使用して、スクリプトブロックをマークアップするために必要なインストルメンテーションを手動で加えます。これらは CPU Usage プロファイラーモジュール に表示されます。
ディーププロファイリングなしで GC.Alloc サンプルを発生させるコールスタックを見つけるには、アロケーションコールスタック のコレクションを有効にします。プロファイラーコントロールの Call Stacks 設定を有効にすると、タイムラインビューで GC.Alloc サンプルを選択するか、Hierarchy ビューの Show Related Objects パネルを使用してこれらのサンプルのコールスタックを見つけることができます。詳細については、CPU プロファイラーモジュール のアロケーションコールスタックのドキュメントを参照してください。
Profiler ウィンドウの上部は、ゲームの特定の領域をプロファイリングする Profiler Modules (プロファイラーモジュール) に分かれています。アプリケーションをプロファイリングすると、Unity は各モジュールに関連するデータを対応するチャートに表示します。
CPU Usage モジュールは、 アプリケーションが各フレームに費やす時間に関する最適な概要を提供します。他のモジュールはより具体的なデータを収集し、より具体的な領域を調べたり、メモリ消費、レンダリング、 オーディオ統計など、 アプリケーションの重要な要素を監視するのに役立ちます。
各モジュールには独自のチャートがあります。任意のモジュールを選択すると、モジュール詳細パネルがウィンドウの下方に表示されます。これを使ってモジュールが収集した詳細なデータを検査できます。
Profiler Modules | 機能 |
---|---|
CPU Usage | 物理演算、スクリプト、アニメーション、ガベージコレクションなど、アプリケーションが最も時間を費やすエリアの概要を表示します。このモジュールには、アプリケーションに関する幅広いプロファイリング情報が含まれています。このモジュールを使用して、 アプリケーションのより具体的な問題を調査するために使用するモジュールを決定できます。このモジュールは、たとえ閉じても常にアクティブです。CPU Usage プロファイラーモジュール を参照してください。 |
GPU Usage | グラフィックス処理に関する情報を表示します。オーバーヘッドが高いため、デフォルトではこのモジュールはアクティブではありません。GPU Usage プロファイラーモジュール を参照してください。 |
Rendering | Unity がアプリケーションでグラフィックスをどのようにレンダリングするかに関する情報を表示します。静的および動的バッチ処理、SetPass と Draw の呼び出し、三角形、頂点などの情報が含まれます。Rendering プロファイラーモジュール を参照してください。 |
Memory | Unity がアプリケーションでメモリをどのように割り当てるかに関する情報を表示します。これは、スクリプティングアロケーション (GC.Alloc) がどのようにガベージコレクションにつながるのか、またはアプリケーションのアセットメモリ使用量の経時的変化を確認するのに特に役立ちます。Memory プロファイラーモジュール を参照してください。 |
Audio | オーディオソースを再生するタイミングと回数、オーディオシステムに必要な CPU 使用量、Unity がそれに割り当てるメモリ量など、アプリケーションのオーディオに関する情報を表示します。Audio プロファイラーモジュール を参照してください。 |
Video | アプリケーションの ビデオ に関する情報を表示します。Video プロファイラーモジュール を参照してください。 |
Physics | 物理演算エンジンが処理したアプリケーションの物理演算に関する情報を表示します。Physics プロファイラーモジュール を参照してください。 |
Physics (2D) | Physics Profiler モジュールと同様に、このモジュールは物理エンジンがアプリケーションのどこで 2D 物理を処理したかについての情報を表示します。詳しくは、2D Physics Profiler モジュール を参照してください。 |
Network Messages (非推奨) |
マルチプレイヤー高レベル API によって送受信される低レベルのパケットとメッセージに関する情報を表示します。 ノート: マルチプレイヤー高レベル API は非推奨です。 |
Network Operations (非推奨) |
マルチプレイヤー高レベル API によって送受信される低レベルのパケット (SyncVar やコマンドの送信数など) とメッセージに関する情報を表示します。 ノート: マルチプレイヤー高レベル API は非推奨です。 |
UI | Unity がアプリケーションの UI バッチをどのように処理するか (Unity がアイテムをバッチする理由や方法など) に関する情報を表示します。UI Profiler モジュールと UI Details Profiler モジュール を参照してください。 |
UI Details | UI モジュールと同様に、このモジュールのチャートには、バッチや頂点数に関するデータや、UI の変更をトリガーするユーザー入力イベントの情報を含むマーカーが表示されます。UI Profiler モジュールと UI Details Profiler モジュール を参照してください。 |
Global Illumination | Unity がアプリケーションのグローバルイルミネーション (GI) ライティングサブシステムに費やす CPU リソースに関する情報を表示します。Global Illumination Profiler ウィンドウ を参照してください。 |
Virtual Texturing | アプリケーションの ストリーミング仮想テクスチャリング に関する統計情報を表示します。Virtual Texturing Profiler モジュール を参照してください。 |
GPU、UI、Audio Profiler モジュールなどの一部の Profiler モジュールでは、大きなデータ収集オーバーヘッドがあります。これらのモジュールがアプリケーションのパフォーマンスに影響を与えないようにするには、Profiler Module ドロップダウンで選択を解除して非アクティブにします。これにより、ウィンドウからモジュールが削除され、プロファイラーによるモジュールのデータ収集が停止され、プロファイラーのオーバーヘッドが減少します。
アクティブでないときでも常にデータを収集する CPU Usage モジュールには適用されません。なぜなら、他のモジュールが依存しているためです。
モジュールを追加するには、Profiler Module ドロップダウンを選択し、アクティブにしたいプロファイラーを選択します。ドロップダウンからプロファイラーモジュールを選択すると、データの収集を開始しますが、アクティブでなかった期間のデータは表示されません。
GPU プロファイラーモジュールのオーバーヘッドを避けるために、デフォルトではアクティブではありません。GPU プロファイラーモジュールは、グラフィックスドライバーにフックするために、アプリケーションの開始時にアクティブでなければなりません。後で追加するとほとんどのプラットフォームでは効果がなく、プロファイラーに “GPU profiling is not supported by the graphics card driver (または it was disabled because of driver bugs)” (GPU プロファイリングはグラフィックスカードドライバーでサポートされていません。または、ドライバーのバグのため無効でした) というメッセージが表示されます。
Profiler ウィンドウを使わずに Profiler.logFile API を使用してデータを収集しディスクに送信するようにプロファイラーに指示する場合は、 Profiler.SetAreaEnabled() を使用してプロファイラーモジュールをオフにすることができます 。
外部 IDE を通してスクリプトをデバッグする設定の中には、オーバーヘッドが発生するものもあります。このオーバーヘッドを避け、より正確な測定値を得るには、Editor Attaching 設定を無効にします (Preferences > External Tools)。同様に、ビルドプレイヤーをプロファイリングするときは、 Build Settings を開き、 Script Debugging を無効にしてオーバーヘッドを回避します。
Profiler ウィンドウの上部には、経時的なパフォーマンスデータがフレームごとに表示されます。アプリケーションを実行すると、プロファイラーは各フレームのデータを記録します。デフォルトでは、Profiler ウィンドウにはプロファイリングされた最後の 300 フレームの履歴が表示されます。Preferences ウィンドウでプロファイリングするフレーム数を最大 2,000 まで増やすことができます。
Profiler ウィンドウのプロファイラーフレームチャートエリアをクリックすると、白い線が表示され、アプリケーションのフレームの 1 つが強調表示されます。フレーム間を移動するには、Profiler ウィンドウのツールバーの 移動コントロール を使用します。
Unity はチャートの垂直方向のスケールを自動的に管理し、チャートはウィンドウの垂直方向のスペースを埋めようとします。チャートの詳細を表示するには、他のプロファイラーモジュールを削除するか、チャートと詳細統計エリアの間の境界線をドラッグして、チャートの画面領域を増やします。
チャートで指標の表示と非表示を切り替えるには、モジュールのラベルの横にある色付きの正方形をクリックします。これは、スパイクの原因を特定するのに役立ちます。CPU Usage プロファイラーのチャートなどの積み上げチャートでは、指標ラベルを並べ替えて、積み上げ順序を変更できます。これは、より目立つ指標をより見やすくするのに役立ちます。
各プロファイラーモジュールは、異なるパフォーマンスデータの指標を収集し、別々のチャートに表示します。フレームをクリックすると、Unity は Profiler ウィンドウの下半分のモジュール詳細パネルにフレームの詳細を表示します。このウィンドウの詳細のタイプは、選択するプロファイラーモジュールによって異なります。各モジュールがこのエリアに表示する特定の詳細については、プロファイラーモジュール の個々のドキュメントを参照してください。
スタンドアロンプロファイラーを使用するには、 Window > Analysis > Profiler (Standalone process) に移動します。スタンドアロンプロファイラーを選択すると、Unity はプロファイラーを Unity エディターのプロセス外で起動し、代わりに新しい別のプロセスでプロファイラーを起動します。
プロファイラーを専用のプロセスで起動することで、エディターや再生モードをターゲットにする場合に、プロファイラーのデータがよりきれいになります。また、プロファイラーがそれ自体をプロファイルしたり、アプリケーションやエディターとプロセスを共有したりしないので、オーバーヘッドを減らすことができます。プロファイラーの機能と制御は、エディターと同じプロセスでプロファイラーを起動するときと同じです。
Profiler ウィンドウを別プロセスで起動する場合、エディターと同じ処理で開くよりも起動に時間がかかります。別プロセスに接続しているエディターのウィンドウをメインプロセスのウィンドウにドッキングすることはできません。また、エディターを再起動するときに、別プロセスのプロファイラーのウィンドウを開くことはできません。
ビルドしたプレイヤーや Unity エディターをコマンドライン (Windows のコマンドプロンプト、macOS のターミナル、Linux シェル、Android の adb など) から起動する場合は、コマンドライン引数を渡してプロファイラーの設定を行うことができます。
コマンドライン引数 | 説明 |
---|---|
-deepprofiling |
ビルドしたプレイヤーでディーププロファイリングを有効にします。 |
-profiler-enable |
プレイヤーやエディターの起動をプロファイリングします。プレイヤーでこの引数を使用すると、Build Settings で Autoconnect Profiler オプションを有効にしてプレイヤーをビルドするのと同じ効果があります。 エディターでこの引数を使用すると、エディターの起動時に Profiler ウィンドウでプロファイラー情報の収集と表示を開始します。 |
-profiler-log-file <Path/To/Log/File.raw> |
この引数は、プロファイルデータを .raw ファイルに送信するようにプロファイラーを設定します。プレイヤーとエディターの両方で使用できます。 |
-profiler-capture-frame-count <NumberOfFrames> |
この引数は、起動時に .raw ファイルに送信する場合に、プロファイルでキャプチャするフレーム数を設定します。プレイヤーでのみ機能します。 |
-profiler-maxusedmemory |
デフォルトでは、maxUsedMemory はプレイヤー用に 16MB、エディター用に 256MB です。この引数を使用して、起動時に maxUsedMemory パラメーターをカスタムサイズに設定できます (例えば、-profiler-maxusedmemory 16777216 )。サイズはバイト単位で設定します。 |