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

CPU Usage プロファイラー

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

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

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

各項目の選択

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

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

階層的に表示されているタイムデータで、Self の行は、特定の関数にかかった時間の量が表示されています。これにサブ関数の呼び出しに要した時間は含まれません。上のスクリーンショットの例では、時間の41.1%は Camera.Render 関数に消費されています。この関数は多くの作業をこなしており、さまざまな描画とカリングの関数を呼び出しています。しかし実際には、これらの関数を除けば、Camera.Render 関数自身に使用したのは消費時間のうち2.1% にしかすぎません。

Time msSelf ms の列には、同じ情報がミリ秒で表示されます。 Camera.Render には 0.01ミリ秒かかりますが、呼び出すすべての関数を含めると 0.21ミリ秒を消費します。GC Alloc 列には、現在のフレームに割り当てられているメモリの量が表示されます。このメモリは、あとでガベージコレクタによって収集されます。ガベージコレクタがフレームレートに不具合を引き起こさないようにするには、この値をゼロに維持するようにします。

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 列に表示されます。

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

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

  • Static Collider.Modify (高価な遅延のコスト)
  • Static Collider.Move (高価な遅延のコスト)
  • Static Collider.Create (高価な遅延のコスト)
  • 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のメモリ管理で不要な、または、リソースに負荷のかかる割り当てパターンを検索する場合に便利です。

Unity のネイティブメモリ管理をプロファイルするには、それを記録する必要があります。ネイティブメモリ記録モード (Unityでは Mem Record と呼ばれます) にアクセスするには、 Window > Profiler の順にプロファイラーウィンドウを開きます。 CPU Usage プロファイラーを選択し (表示されていない場合は、 Add Profiler > CPU の順にクリックします)、次に Profiler の下のドロップダウンメニューをクリックします。 次に、 Timeline__をクリックし、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ピクセルの幅を与えます。

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

High Detail 表示を有効にするには、 Window > Profiler を選択してProfiler ウィンドウを開きます。 CPU Usage プロファイラーを選択し (表示されていない場合は、 Add Profiler > CPU をクリック)、プロファイラーの下にあるドロップダウンメニューを選択し、TimelineHigh Detail をクリックします。

Comparison

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

High Detail 表示

通常表示

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