CPU Usage プロファイラーモジュールには、アプリケーションのどこで時間が費やされているかを表示するチャートが含まれています。レンダリング、スクリプト、アニメーションなど、アプリケーションが時間を費やすすべての重要な領域の概要を提供します。このセクションには以下のトピックが含まれます。
CPU Usage プロファイラーモジュールのチャートは、アプリケーションのメインスレッドで費やされた時間を追跡します。タイミングは 9 のカテゴリに分けられます。チャートのカテゴリの順序を変更するには、カテゴリをチャートの凡例にドラッグアンドドロップします。カテゴリの色の付いた凡例をクリックして、表示を切り替えることもできます。
カテゴリ | 説明 |
---|---|
Rendering | アプリケーションがグラフィックスのレンダリングに費やす時間。 |
Scripts | アプリケーションがスクリプトの実行に費やす時間。 |
Physics | アプリケーションが物理演算エンジンに費やす時間。 |
Animation | アプリケーションがアプリケーション内のスキンしたメッシュレンダラー、ゲームオブジェクト、その他のコンポーネントをアニメーション化するのに費やす時間。これには、Animation コンポーネントと Animator コンポーネントが使用するシステムが計算に要した時間も含まれます。 |
GarbageCollector | アプリケーションが ガベージコレクター の実行に費やす時間。 |
VSync | アプリケーションが targetFrameRate または次の VBlank との同期を待機するフレームごとの時間。これは、 QualitySettings.vSyncCount 値、ターゲットフレームレート、または VSync 設定 (アプリケーションが実行されているプラットフォームのデフォルト、または最大値) に基づいています。VSync の詳細については、このページの レンダリングと VSync のサンプル を参照してください。 |
Global Illumination | アプリケーションがライティングに費やす時間。 |
UI | アプリケーションが UI の表示に費やす時間。 |
Others | アプリケーションが他のカテゴリに分類されないコードに費やす時間。これには、EditorLoop すべてや、エディターで再生モードをプロファイルするときのプロファイリングオーバーヘッドなどが含まれます。 |
CPU Usage プロファイラーモジュールを選択すると、その下の詳細ペインに選択したフレームのアプリケーションが使った時間の内訳が表示されます。Timeline (タイムライン) か Detailed (詳細) の 2 通りでそのデータを表示できます。表示を変更するには、詳細ペインの左上のドロップダウンを使用します (デフォルトでは Timeline に設定)。
表示 | 機能 |
---|---|
Timeline | フレームの長さを時間軸にして、特定のフレームの時間消費の内訳を表示します。これは、すべてのスレッドのタイミングを一度に、またそれらが発生したフレーム内の時間内で表示するために使用できる唯一の表示モードです。そのため、スレッド (例えば、メインスレッドのシステムがスケジュールした後に起動する ジョブシステム ワーカースレッド) 間でタイミングを関連付けることができます。 |
Hierarchy | 内部の階層構造によって時間のデータをグループ化します。このオプションは、アプリケーションが呼び出した要素を、使用された時間の降順 (デフォルト) のリスト形式で表示します。また、割り当てられたスクリプトのメモリの量 (GC Alloc)、または呼び出し回数で情報を並べ替えることもできます。表の並び方を決める列を変更するには、表の列のヘッダーをクリックします。 |
Raw Hierarchy | 時間のデータを、タイミングが発生したコールスタックと同様の階層構造で表示します。Hierarchy ビューのように各コールスタックをマージせずに、このモードでは個別にリストします。 |
ライブ 設定は各ビューで使用可能で、Playmode またはエディターで新しいデータの記録を開始すると、モジュールの詳細ペインに現在のフレームまたは選択したフレームに関する情報が表示されます。これを有効にするには、モジュールの詳細ドロップダウンの横にある Live ボタンをクリックします。デフォルトではこの設定は無効になっており、データを記録するときモジュールの詳細ペインは空白です。ノート: この設定により、Profiler ウィンドウが再描画されるときに EditorLoop
のオーバーヘッドが増加します。
さらに、各ビューで More Items メニュー (⋮) を選択し、 Show Full Scripting Method Names を有効にすると、すべてのスクリプトメソッドのフルバージョンの名 (Assembly::Class::MethodName
) が表示されます。
Timeline ビューは CPU Usage プロファイラーモジュールのデフォルトビューです。このビューは、アプリケーションで時間を使う場所と、タイミングが互いにどのように関連しているかについての概要を表示します。Timeline ビューでは、 Hierarchy ビューとは異なり、すべてのスレッドのプロファイリングデータを独自のサブセクションに同じ時間軸に沿って表示します。 Hierarchy ビューには、一度に 1 つのスレッドのみ (デフォルトではメインスレッド) のプロファイリングデータが表示されます。また、Hierarchy ビューはサンプルの継続時間のみを表示しますが、Timeline ビューは各サンプルが発生した時間を表示します。
タイムラインビューを使用して、並列実行で異なるスレッドのアクティビティが互いにどのように相関しているかを確認できます。 Job Systemのワーカースレッドなど、さまざまなスレッドをどれだけ使用しているか、どれだけ使用しているか、スレッドでの作業がどのようにキューに入れられているか、アイドル状態( Idle サンプル)か、別のスレッドや待機中の スレッドがあるかを確認できます。ジョブの終了( Wait for x サンプル)
時間軸のエリアを拡大するにはマウスのスクロールホイールを使用するか、Alt キーを押しながらマウスの右ボタンを押してドラッグします。水平スクロールバーの端を使用して拡大することもできます。ズームをリセットするにはキーボードの A キーを押します。すると、フレーム時間全体が表示されます。
スレッドの下部に白い矢印が表示されている場合は、クリックしてスレッドを展開するとすべての行が表示され、再度クリックすると一番上の行のみが表示されます。スレッドを分ける線をドラッグして、表示される行の数を再調整することもできます。行をダブルクリックすると、スレッドセクションの高さがコールスタックの最大の深さに設定されます。ビューをパンするには、マウスの中ボタンを押すか、 Alt キー (macOS では Command キー) を押しながらマウスの左ボタンを押します。
スレッドのグループを折りたたんだり展開したりするには、ビューの左端にあるスレッド名の横の折りたたみ矢印をクリックします。
CPU チャートに対する項目の寄与を表示するには、下のペインで項目を選択します。プロファイラーはその寄与を強調し、チャートの残りの部分を暗くします。項目の選択を解除するには、ビュー内の任意の場所をクリックします。F キーを押すと、選択した現在のサンプルにフォーカスが移動します。何も選択しない場合は、デフォルトのズームレベルで表示されます。
上の画像では、選択したアイテムのツールチップに、インスタンス数やすべてのスレッドにわたるこのサンプルの合計時間などの詳細が表示されます。GC.Alloc サンプルは赤紫色でアロケーションのサイズを示します。
マネージコールスタックをツールチップに表示するには、Profiler ウィンドウのツールバーに移動し、Call Stacks ボタンを選択します。フレームのコールスタックを表示するには、フレームをプロファイルする前にこのプロパティを有効にする必要があります。詳細については、アロケーションコールスタック を参照してください。
Hierarchy または Raw Hierarchy ビューに切り替えると、サンプルがメインスレッド上にある限り、選択が引き継がれます。選択したものがすぐに見つからない場合は、F キーを押してフォーカスします。
Hierarchy ビューには、プロファイルしたすべてのサンプルがリストされ、共有コールスタックと ProfilerMarkers の階層によってグループ化されます。 Raw Hierarchy ビューはサンプルをグループ化しないため、サンプルを詳細に確認するのに理想的です。Thread ドロップダウンを使用して特定のスレッドを選択することもできます。例えば、このビューで Main Thread や Render Thread を検査することができます。
デフォルトでは、すべての EditorOnly サンプルはこれらのビューで折りたたまれています。EditorOnly サンプルは、エディターのみの安全性チェックのためにのみ発生する Player Loop のサンプルです。サンプルが折りたたまれている場合、それらの GC.Alloc 値はそれらを含むサンプルの GC.Alloc 値に影響しません。これらのサンプルを表示するには、詳細ペインの右上にある More Items メニュー (⋮) を選択し、 Collapse EditorOnly Samples 設定を無効にします。詳細は、このドキュメントの エディターのみのサンプル のセクションを参照してください。
両方のビューは、各項目の以下の詳細情報を表示します。
プロパティ | 機能 |
---|---|
Total | Unity が特定の関数に費やした合計時間 (パーセンテージ) |
Self | Unity が特定の関数に費やした合計時間 (サブ関数の呼び出しに要した時間を除く。パーセンテージ)。 例えば、スクリーンショットでは、時間の 16.7% が Camera.Render 関数に費やされています。これは多くの描画とカリング関数を呼び出すためです。ただし、呼び出す関数を除外すると、Camera.Render 関数自体に費やされる時間はわずか 0.2% です。 |
Calls | このフレームでこの関数に対して行われた呼び出しの数。Raw Hierarchy ビューでは、プロファイラーはサンプルの階層をマージしないため、この列の値は常に 1 です。 |
GC Alloc | Unity が現在のフレームに割り当てたスクリプティングのヒープメモリの量。スクリプティングのヒープメモリは、ガベージコレクタ によって管理されます。 Unity が GC.Collect() を呼び出すか、ヒープの現在のサイズに収まらないスクリプティングヒープの割り当てがある場合は常に、ガベージコレクターがトリガーされます。参照がなくなったすべての割り当てにマークを付けて収集します。このプロセスは、プロファイラーで GC.Collect サンプルとして表示されます。Unity は、ヒープにより多くを割り当てると、ガベージコレクターをより頻繁に実行します。 マネージヒープが増加すると、Unity がメモリにマークして回収するのに時間がかかります。そのため、アプリケーションの実行中は GC Alloc 値をゼロに保ち、ガベージコレクターがフレームレートに影響を与えないようにし、全体的なヒープサイズを小さく保つ必要があります。 管理ヒープの詳細については、自動メモリ管理 のドキュメントを参照してください。 |
Time ms | Unity が特定の関数に費やした合計時間 (ミリ秒)。アプリケーションが Job System やマルチスレッドレンダリングを使用する場合、現在選択しているスレッドで費やした時間しか含まれていないため、この情報は誤解を招く可能性があります。スレッドを変更するには、Hierarchy ペインの上部にある Thread ドロップダウンを選択します。 |
Self ms | Unity が特定の関数に費やした合計時間 (ミリ秒)。Unity がサブ関数を呼び出す時間は除きます。 |
Warning | 警告アイコンで示され、現在のフレーム中にアプリケーションが警告をトリガーした回数を表示します。詳細については、パフォーマンスの警告 を参照してください。 |
アプリケーションがプロファイルされた関数をどこで呼び出し、使用するかに関する詳細情報を取得するには、モジュールの詳細ペインの右上にある Details ドロップダウンを選択し、Show Related Objects か Show Calls ビューのいずれかを選択します。
Show Related Objects ビューは、Begin() オーバーロードを使用し、プロファイラーサンプルに関連付けられている UnityEngine.Objects
のリストを表示します。Unity が報告する一部のサンプルには、レンダリングを行う Camera ゲームオブジェクトにリンクされているCamera.Render サンプルなど、組み込まれたアソシエーションが含まれます。エディターでプロファイルすると、Unity はインスタンス ID を使ってこれらのオブジェクトを報告し、Profiler ウィンドウで名前に解決します。ビルドしたプレイヤーをプロファイルするとき、またはディスクからキャプチャをロードするとき、これらの名前は表示されず、プロファイラーは N/A
と表示します。
これらのオブジェクトの 1 つをクリックすると、Unity はシーンの Hierarchy を使ってオブジェクトを検索し、ping しようとします。アソシエーションはインスタンス ID を使用するため、ping はアプリケーションがエディターでプロファイルされている場合と、 オブジェクトがまだ存在している場合にのみ機能します。
GC.Alloc
サンプルの場合、このビューには、この階層レベルで発生した各割り当てに 1 つずつ、N/A
項目のリストが表示されます。割り当てのサイズは GC.Alloc 列に表示されます。Call Stacks 設定を有効にしてアプリケーションをプロファイルする場合、このビューで GC.Alloc
サンプルを選択すると、Deep Profiling 設定を有効にしていなくても、割り当てられたスクリプティングオブジェクトのコールスタックが Profiler ウィンドウに表示されます。詳細については、アロケーション、割り当てコールスタック を参照してください。
Show Calls ビューは、選択されたサンプルがどこから呼び出されているか、他のどの関数を呼び出すかを表示します。
デフォルトでは、GC.Alloc サンプルに割り当てられたコールスタックは無効になっています。これは、コールスタックが複数フレームの遅延でアプリケーションを混乱させる可能性があるためです。ただし、Unity がコードを実行する様子を確認するために、すべてのコールスタックを確認したい場合があります。
これを行うには、Profiler ウィンドウのツールバーに移動し、 Call Stacks ボタンを選択します。この機能は、エディターでプロファイルする場合でも、実行中のプレイヤーでプロファイルする場合でも使用できます。このオプションをオンにすると、プロファイルするフレームでは、GC.Alloc サンプルにコールスタックが含まれます。
すべてのスクリプティングヒープの割り当ては、Hierarchy ビューと Timeline ビューの両方で GC.Alloc サンプルとして表示されます。Timeline ビューでは、明るい赤紫色になります。コールスタックを表示するには、CPU プロファイラーモジュールを選択し、Timeline ビューで GC.Alloc サンプルを選択します。コールスタックは、選択範囲がハイライトされて表示されます。
代わりに、Hierarchy または Raw Hierarchy ビューでコールスタックを見ることができます。Details ビューを Show Related Objects に設定します。GC.Alloc サンプルには名前がないため、このパネルでは N/A と表示されます。N/A オブジェクトを選択すると、プロファイラーは詳細ビューの下半分にコールスタックを表示します。
マネージアロケーションの詳細については、自動メモリ管理を理解します を参照してください。
スクリプティングコードが生成するサンプルと同様に、Unity は、アプリケーションで何に時間がかかっているかを理解するための多くのサンプルを提供します。以下の表は、一般的なサンプルの一部を説明しています。
メインスレッドの基本サンプルは、アプリケーションに費やされた時間と、エディターとプロファイラーの働きに費やされた時間を明確に区別します。Recorder は、これらのサンプルを使用してメインスレッドのフレームのタイミングを取得することもできます。
サンプル | 機能 |
---|---|
PlayerLoop | アプリケーションのメインループから発生するサンプルのルート。プレイヤーがアクティブな再生モードのエディターで実行されているときに、再生モード ではなく エディター をターゲットにする場合、このサンプルは EditorLoop の下にネスト状になります。 |
EditorLoop | エディターのメインループから発生したサンプルのルート。これは、エディターでプレイヤーをプロファイルする間にのみ表示されます。プロファイラー で 再生モード をターゲットにする場合、このサンプルは、フレームのどのくらいの時間がプレイヤーを含むエディターのレンダリングと実行に費やされたかを示します。エディターの動作を確認したい場合は、ターゲットを エディター に切り替えます。 |
Profiler.CollectEditorStats | さまざまな種類のアクティブなプロファイラーモジュールの統計の収集に関連するサンプルのルート。 子サンプル Profiler.CollectGlobalStats 下の任意のサンプルは、プレイヤーのオーバーヘッドの起因になります。他のすべての子サンプルはエディターにのみ影響します。特定のモジュールをオフにするには、それらのチャートを閉じるか、Profiler.SetAreaEnabled() を 呼び出します。 |
ジョブシステムを使用していない限り、ほとんどのスクリプトコードは以下のサンプルの下にネストされます。
サンプル | 機能 |
---|---|
Update.ScriptRunBehaviourUpdate | このサンプルには、MonoBehaviour.Update への呼び出しとコルーチンの処理が含まれています。 |
BehaviourUpdate | このサンプルは、すべての Update() メソッドを処理します。 |
CoroutinesDelayedCalls | 最初の yield の後にコルーチンサンプルが含まれます。 |
PreLateUpdate.ScriptRunBehaviourLateUpdate | このサンプルは、すべての LateUpdate() メソッドを処理します。 |
FixedBehaviourUpdate | このサンプルは、すべての FixedUpdate() メソッドを処理します。 |
これらのサンプルは、CPU が GPU のデータ処理の何に時間を費やしているのか、または、どこで GPU の終了を待機しているのかを表示します。GPU プロファイラーが使用できない場合や、オーバーヘッドが多すぎる場合は、ツールバーにこの情報は表示されません。これらのサンプルは、アプリケーションが CPU バウンドか GPU バウンドかを判断するのに役立ちます。
サンプル | 機能 |
---|---|
WaitForTargetFPS |
Application.targetFrameRate が指定するターゲット FPS をアプリケーションが待機する時間。 このサンプルが Gfx.WaitForPresentOnGfxThread のサブサンプルである場合、QualitySettings.vSyncCount で構成された VSync を待機するのにアプリケーションが使う時間を表します。 ノート: エディターは GPU で VSync を実行せず、代わりに WaitForTargetFPS を使用して VSync の遅延のシミュレーションを行います。一部のプラットフォーム、特に Android と iOS は、VSync を適用するか、デフォルトのフレームレートの上限を 30 または 60 にします。 |
Gfx.ProcessCommands | レンダースレッドのレンダリングコマンドのすべての処理が含まれます。その時間の一部は、メインスレッドからの VSync または新しいコマンドの待機に費やされる場合があります。それは、その子サンプル Gfx.WaitForPresentOnGfxThread から確認できます。 |
Gfx.WaitForCommands | レンダースレッドが新しいコマンドの準備ができていることを示し、メインスレッドのボトルネックを示す場合もあります。 |
Gfx.PresentFrame | GPU がフレームをレンダリングして表示するのをアプリケーションが待機する時間を示します。これには VSync を待機する時間も含まれる場合があります。 メインスレッドの WaitForTargetFPS サンプルは、VSync の待機に費やされる時間を示します。 |
Gfx.WaitForPresentOnGfxThread | メインスレッドが次のフレームのレンダリングを開始する準備ができているが、レンダースレッドが GPU でフレームを表示するのを待機し終えていないことを示します。これは、アプリケーションが GPU バウンドであることを示している可能性があります。 レンダースレッドが同時に何に時間を費やしているかを確認するには、Timeline ビューを確認してください。 レンダースレッドが Camera.Render で時間を費やしている場合、アプリケーションが CPU バウンドで、ドローコールやテクスチャを GPU に送信するのに時間をかけすぎている可能性があります。 レンダースレッドが Gfx.PresentFrame で時間を費やす場合、ゲームは GPU バウンドか、GPU で VSync を待機している場合があります。Gfx.WaitForPresentOnGfxThread の WaitForTargetFPS サブサンプルは、アプリケーションが VSync の待機に費やす現在のフェーズの部分を示します。現在のフェーズは、Unity がグラフィックス API にバッファを交換するように指示してから、この操作が完了するまでの時間です。 |
Gfx.WaitForRenderThread | レンダースレッドが現在コマンドストリームにあるすべてのコマンドを処理するのをメインスレッドが待機していることを示します。このサンプルは、マルチスレッドレンダリングでのみ発生します。 |
これらのサンプルは CPU サイクルを消費しませんが、代わりにスレッドとジョブシステムに関連する情報を強調します。これらのサンプルが表示されたら、Timeline ビュー を使用して、同時に他のスレッドで何が起こっているかを確認します。
サンプル | 機能 |
---|---|
Idle | ジョブシステムがワーカースレッドを使用しない場合は常に、Idle サンプルを発行します。Idle サンプル間の小さなギャップは通常、例えば新しいジョブをスケジュールするためにジョブシステムがそれらを起動するときに発生します。長いギャップは、インストルメント化されていないネイティブのジョブを示します。 |
Semaphore.WaitForSignal | このスレッドは別のスレッドで何かが終了するのを待機しています。待機しているスレッドを見つけるには、Timeline ビューでこのサンプルの直前に終了したサンプルを確認します。 |
WaitForJobGroupID | JobHandle の同期フェンスがトリガーされました。これは、ワークスチール を引き起こす可能性があります。これは、ワーカーが作業を終了し、他のワーカージョブが完了するのを確認するときに発生します。これらは、このサンプルの下で実行されるジョブサンプルとして表示されます。“盗まれた” ジョブは、必ずしも待機されていたジョブではありません。 |
次の表は、高レベルの物理演算プロファイラーサンプルの一部をまとめたものです。FixedUpdate()
はこれらすべてのサンプルを呼び出します。
サンプル | 機能 | |
---|---|---|
Physics.Simulate | シミュレーションを実行するよう物理演算エンジンに指示して、現在の物理演算状態を更新します。 | |
Physics.Processing | クロス以外のすべての物理関連ジョブを処理します。このサンプルを展開すると、 物理演算エンジンで内部的に行われた作業の低レベルの詳細が表示されます。 | |
Physics.ProcessingCloth | すべてのクロスの物理演算ジョブを処理します。このサンプルを展開すると、 物理演算エンジンで内部的に行われた作業の低レベルの詳細が表示されます。 | |
Physics.FetchResults | 物理演算エンジンによる物理演算シミュレーションの結果を収集します。 | |
Physics.UpdateBodies | すべての物理関連ボディの位置と回転を更新します。このサンプルには、これらの更新が送信されるときに通知するメッセージも含まれています。 | |
Physics.ProcessReports | 物理演算の FixedUpdate が終了すると実行されます。シミュレーションの結果に応答するさまざまな段階を処理します。このサンプルには、接触、ジョイントのブレーク、更新とメッセージのトリガーが含まれます。4 つの異なるサブステージがあります。 |
|
Physics.TriggerEnterExits |
OnTriggerEnter と OnTriggerExit イベントを処理します。 |
|
Physics.TriggerStays |
OnTriggerStay イベントを処理します。 |
|
Physics.Contacts |
OnCollisionEnter 、OnCollisionExit 、OnCollisionStay イベントを処理します。 |
|
Physics.JointBreaks | 壊れたジョイントに関連する更新とメッセージを処理します。 | |
Physics.UpdateCloth | クロスとそのスキンメッシュに関する更新が含まれます。 | |
Physics.Interpolation | すべての物理演算オブジェクトの位置と回転の補間を管理します。 |
スクリプトのライフサイクル内のスクリプトのライフサイクルと一般的なサンプルの詳細については、イベント関数の実行順序 を参照してください。
CPU プロファイラーは一般的なパフォーマンスの問題を検出し、警告します。これらは、モジュールの詳細ペインの Hierarchy ビューの Warning 列に表示されます。
プロファイラーは、パフォーマンスに重要なコンテキストで避けるべき特定の呼び出しを検出できます。以下のように、操作がパフォーマンスに影響を与えている理由とともに警告を表示します。
一部のサンプルは、エディターでプロファイルするときにのみ表示されます。これには、GetComponentNullErrorWrapper などのセキュリティチェックが含まれます。これは、null コンポーネントの使用を識別するのに役立ちます。CheckConsistency はオブジェクトの設定を検証します。CheckAllowDestructionRecursive は破棄のチェックです。プレハブ関連の作業も含まれます。これらのサンプルのすべてがプレイヤーにあるわけではありません。
デフォルトでは、エディターのみのサンプルは Hierarchy ビューで折りたたまれ、EditorOnly [サンプル名]
と名付けられます。ガベージコレクションの割り当てを引き起こす可能性がありますが、それらが折りたたまれている場合、それらを含むサンプルの GC.Alloc 値には影響しません。
デフォルトの動作を変更するには、モジュールの詳細ペインの右上にあるコンテキストメニューをクリックし、Collapse EditorOnly Samples 設定を無効にします。これを行うと、サンプルを展開し、その GC.Alloc 値を一緒に梱包するサンプルに加えることができます。
このオプションは Timeline ビューには影響しません。通常は、これらのサンプルを無視するか、それらをプロンプトとして使用してターゲットデバイスでプレイヤービルドをプロファイルして、実際の問題を見つけます。