Profiler ウィンドウ
Rendering プロファイラー

CPU Usage プロファイラー

CPU Usage プロファイラー (CPU使用率プロファイラー) はゲームのどの部分で時間が使用されているかを表示します。選択すると、下方のペインは選択されたフレームの階層的なタイムデータを表示します。詳細は プロファイラーウィンドウ を参照してください。

  • Hierarchy モード 階層的にタイムデータを表示します。
  • Group Hierarchy モード タイムデータを論理グループ (Rendering、Physics、Scripts その他) に分けます。グループ内の子はすべて、別のグループにも入れるため (例えばスクリプトがレンダリング関数を呼ぶ、等)、グループの時間は 100%を超えることがしばしばあります。

グラフのラベルを上下にドラッグして CPU グラフの重なり順を変えることができます。

各項目の選択

下方のペインの項目を選択すると、その CPU のグラフに関係しているものはハイライトされます (残りは薄く表示されます)。選択解除するには項目を再度クリックします。

Render.OpaqueGeometry が選択され、その属性がグラフの中でハイライトされています
Render.OpaqueGeometry が選択され、その属性がグラフの中でハイライトされています

In the hierarchical time data, the Self column refers to the amount of time spent in a particular function, not including the time spent calling sub-functions. In the screenshot above, 1.9% of time is spent in the Camera.Render function. This function does some work in this frame and calls the various drawing and culling functions. Excluding all of these functions, only 0.4% of time is spent in the Camera.Render function itself.

The Time ms and Self ms columns show the same information but in milliseconds. Camera.Render takes 0.06ms but, including all the functions it calls, 0.31ms are consumed. The GC Alloc column shows how much memory has been allocated in the current frame, which is later collected by the garbage collector. Keep this value at zero to prevent the garbage collector from causing hiccups in your framerate.

CPUプロファイラーの Others セクションには、レンダリング、スクリプト、物理、ガベージコレクション、VSync に該当しないすべての領域の合計が記録されます。これには、アニメーション、AI、オーディオ、パーティクル、ネットワーク、読み込み、PlayerLoop が含まれます。

Physics マーカー

以下は、さまざまな高レベルの Physics プロファイラーのマーカーの意味を簡単に説明しています。

  • Physics.Simulate: FixedUpdate から呼び出されます。この関数が物理シミュレートを行う PhysX に指示を出すことによって物理の現状を更新します。
  • Physics.Processing: FixedUpdate から呼び出されます。布の物理演算以外はすべてここで処理されます。このマーカーを開くと PhysX 内部で実行されている作業の低レベルの詳細が表示されます。
  • Physics.Processing: FixedUpdate から呼び出されます。布の物理演算以外はすべてここで処理されます。このマーカーを開くと PhysX 内部で実行されている作業の低レベルの詳細が表示されます。
  • Physics.FetchResults: FixedUpdate から呼び出されます。ここに、物理エンジンから収集された物理シミュレーションの結果が保存されます。
  • Physics.UpdateBodies: FixedUpdate から呼び出されます。この関数はすべての物理的な物体の位置と回転を更新させます。更新指令の送信元も同様に更新します。
  • Physics.ProcessReports: FixedUpdate から呼び出されます。このステージは物理の FixedUpdate によって最終的な状態が決定するたびに1度実行され、シミュレーション結果に応じてさまざまなステージが処理されます。接触、結合の解除やトリガーはこちらから送信されるメッセージで更新されます。これには独自な4つのステージがあります。
    • Physics.TriggerEnterExits: FixedUpdate から呼び出されます。ここでは OnTriggerEnterOnTriggerExit イベントが処理されます。
    • Physics.TriggerEnterExits: FixedUpdate から呼び出されます。ここでは OnTriggerEnterOnTriggerExit イベントが処理されます。
    • Physics.TriggerEnterExits: FixedUpdate から呼び出されます。ここでは OnTriggerEnterOnTriggerExit イベントが処理されます。
    • Physics.JointBreaks: FixedUpdate から呼び出されます。ここではジョイントの破壊の処理に関係したことの更新、メッセージの送信を行います。
  • Physics.UpdateCloth: Update から呼び出されます。ここでは布や、Skinned Mesh の形成に関連したことを更新します。
  • Physics.Interpolation: Update から呼び出されます。このステージはすべての物理オブジェクトの位置や回転の補間を処理します。

パフォーマンスに関する警告

CPU プロファイラーが検知し、警告できる一般的な問題がいくつかあります。これらの警告は CPU Usage を見ていると、下方ペインの Warning 列に表示されます。

静的コライダーが移動されたことを警告するプロファイラー
静的コライダーが移動されたことを警告するプロファイラー

プロファイラーが検知し得る特別な問題には以下のようなものがあります。

  • Rigidbody.SetKinematic [凸状でない Rigidbody 用のメッシュコライダーを再作成します]
  • Animation.DestroyAnimationClip [RebuildInternalState を引き起こします]
  • Animation.AddClip [RebuildInternalState を引き起こします] *Animation.RemoveClip [RebuildInternalState を引き起こします]
  • Animation.Clone [RebuildInternalState を引き起こします]
  • Animation.Deactivate [RebuildInternalState を引き起こします]

上記スクリーンショットでは、プロファイラーは Static Collider.Move の警告を発しています。 Warning 列では現在のフレームで 12 回警告が発生しています。 “Delayed Cost” という用語は、プロファイラーは現時点では低いコストを示しているかもしれませんが (この場合 0.00ms です)、このアクションはよりダメージのある操作を後に引き起こす可能性があることを意味しています。

CPU Profiler Timeline

Mem Record ネイティブメモリパフォーマンスプロファイリング

ネイティブメモリパフォーマンスプロファイリングを使用すると、Unity のネイティブメモリ管理システム内のアクティビティをプロファイルし、ランタイムパフォーマンスにどのように影響するかを評価できます。 これは、Unityのメモリ管理で不要な、または、リソースに負荷のかかる割り当てパターンを検索する場合に便利です。

To profile Unity’s native memory management, you need to record it. To access native memory recording mode (called Mem Record in Unity), go to Window > Analysis > Profiler to open the Profiler window. Select the CPU Usage Profiler (if it is not visible, click Add Profiler > CPU) then the drop-down menu underneath the Profiler. Next, click Timeline and then select Mem Record.

Record モードを選択
Record モードを選択
オプション 機能 パフォーマンスに与える影響
None モードが無効です。デフォルトではこの設定になっています。 該当なし
Sample only メモリアロケーション、再アロケーション、メモリアロケーション解除、アクティビティの種類、システムをレコードします。
Callstack (fast) これは Sample only と同じ働きをしますが、ネイティブアロケーションサイトからの短縮されたコールスタックも記録します (そのネイティブアロケーションサイトに、コールバックはネイティブからスクリプトシンボルへと変化します)。事実上、コールスタックは最も深いスクリプトシンボルまでしか見ることができません。
Callstack (full) Sample only と同じ働きをしますが、すべてのスクリプトからネイティブ、ネイティブからスクリプトへの変化のあるコールスタックもレコードします。

ノート アクティブなプロファイラーがスタンドアロンプレイヤーに接続しているだけの場合、影響の少ない Sample only モードのみが適用可能です。

レコードしたメモリアロケーションのサンプルは Profiler ウィンドウに明るい赤で表示されます。

Mem Record の横にある High Detail ボタンをクリックして High Detail モードを有効にします。割り当てタイプとシステムを表示するためにサンプルを選択します。選択された割り当てサンプル用にコールスタックがレコードされた場合、関連するコールスタックシンボルも解決され、表示されます。

Using Mem Record

Mem Record 機能が役に立つさまざまな例があります。

  • どのようなときに、システムが、2–3 の大きなアロケーションではなく、多くの小さなアロケーションを行うかの研究。
  • どのようなときに、ワーカースレッドが誤ってメモリを割り当てるか(たとえば、意図しないMemLabel の使用など)の研究。
  • 排他ロック (複数のスレッドが同時にネイティブメモリシステムにアクセスしようとする場合) の検出。
  • メモリ断片化の原因の発見(特にメモリ不足のデバイスにとって重要)。

Timeline の High Detail 表示

CPU Usage プロファイラーの Timeline の High Detail 表示では、Unity の CPU Usage プロファイラーでレコードしたすべての時間サンプルに少なくとも1ピクセルの幅を与えます。

これにより、スレッド同期やメモリアロケーションなどの短命なアクティビティーを含め、フレーム内のすべてのアクティビティーの完全な概要を見ることができます。

To enable the High Detail view, go to Window > Analysis > Profiler to open the Profiler window. Select the CPU Usage Profiler (if it is not visible, click Add Profiler > CPU) then select the drop-down menu underneath the Profiler and click Timeline followed by High Detail.

Comparison

以下の 2 つの画像は CPU Usage プロファイラーの Timeline の High Detail 表示と 通常の表示の違いを示しています。

High Detail 表示

通常表示

Profiler ウィンドウ
Rendering プロファイラー