Version: 2022.1
言語: 日本語
Memory Profiler モジュール
2D Physics プロファイラーモジュール

Physics プロファイラーモジュール

Physics (物理演算) プロファイラーモジュールは、プロジェクトのシーンで物理システムが処理した物理現象に関する情報を表示します。この情報は、プロジェクトのシーンの物理に関連するパフォーマンスの問題や予期せぬ不一致を診断して解決するのに役立ちます。Physics Debug 視覚化 を使用して、アプリケーションの物理学に関する問題をさらにデバッグし、理解することもできます。

Physics プロファイラーモジュール
Physics プロファイラーモジュール

チャートのカテゴリ

Physics プロファイラーモジュールのチャートは、アプリケーションで物理演算に使用した時間を追跡します。タイミングはさまざまなカテゴリに分けられています。チャートのカテゴリの順序を変更するには、カテゴリをチャートの凡例にドラッグアンドドロップします。カテゴリの色の付いた凡例をクリックして、表示を切り替えることもできます。チャートをクリックすると、チャートの下のモジュール詳細ペインに各チャートカテゴリの正確な数値が表示されます。

チャート 機能
Physics Used Memory Phisics モジュールが使用したメモリの総量
Active Dynamic Bodies Rigidbody コンポーネントと ArticulationBody コンポーネントのうち、スリープ 状態でないものの数。
Active Kinematic Bodies アクティブな Kinematic Rigidbody コンポーネントの数。キネマティックリジッドボディは、MovePosition または MoveRotation がフレームで呼び出されるとアクティブになり、次のフレームでもアクティブのままです。

ノート: Unity は、フレームごとに複数回アタッチされるジョイントを持つ Kinematic Rigidbody コンポーネントを処理する場合があり、これは表示される値に影響します。
Dynamic Bodies Rigidbody コンポーネントと ArticulationBody コンポーネントの数。
Overlaps オーバーラップイベントの数。オーバーラップイベントは、コライダー が互いに重なり合うときに発生します。
Trigger Overlaps 重複するトリガーの数 (ペア数で数えられます)
Discreet Overlaps Unity が離散型衝突判定を使用して解決したオーバーラップイベントの数。
Continuous Overlaps Unity が連続型衝突判定を使用して解決したオーバーラップイベントの数。
Physics Queries Raycasts やシェイプキャストなどの物理クエリの総量。

モジュールの詳細ペイン

Physics プロファイラーモジュールをクリックすると、モジュールの詳細ペインに、プロジェクトのシーンの物理に関する詳細情報が表示されます。

統計  説明 
Physics Used Memory Phisics モジュールが使用したメモリの総量。
Dynamic Bodies Rigidbody コンポーネントと ArticulationBody コンポーネントの数。
Articulation Bodies シーンに含まれる ArticulationBody コンポーネントの数
Active Dynamic Bodies スリープ 状態でない Rigidbody コンポーネントと ArticulationBody コンポーネントの数。
Active Kinematic Bodies アクティブな Kinematic Rigidbody コンポーネントの数。キネマティックリジッドボディは、MovePosition または MoveRotation がフレームで呼び出されるとアクティブになり、次のフレームでもアクティブのままです。

ノート: Unity は、フレームごとに複数回アタッチされるジョイントを持つ Kinematic Rigidbody コンポーネントを処理する場合があり、これは表示される値に影響します。
Static Colliders コライダー のうち、Rigidbody または ArticulationBody コンポーネントを持たないものの数
Colliders Synced Transform と同期しているコライダーの量。
Rigidbodies Synced Transform と同期しているRigidbodyコンポーネントの量。
Physics Queries Raycasts やシェイプキャストなどの物理クエリの総量。
Total Overlaps オーバーラップイベントの数。オーバーラップイベントは、コライダーが互いに重なり合うときに発生します。
Discreet Unity が離散型衝突判定を使用して解決したオーバーラップイベントの数。
Continuous Unity が連続型衝突判定を使用して解決したオーバーラップイベントの数。
Trigger 重複するトリガーの数 (ペア数で数えられます)
Modified Unity が Contact Modification API を使用して修正したオーバーラップイベントの数。
Broadphase Adds/Removes ブロードフェーズアルゴリズム が追加または削除したコライダーの総数。
Narrowphase Touches 前フレーム以降に失われた、または新たに出現した衝突イベントの総量。

プロファイラーに表示される数は、シーン内の物理演算コンポーネントを持つゲームオブジェクトの正確な数と一致しない場合があります。これは、Physics コンポーネントの中には、それに影響する他のコンポーネント (アタッチした Joint コンポーネントなど) に応じて異なる速度で処理されるものがあるためです。特定の Physics コンポーネントがアタッチしたゲームオブジェクトの正確な数を計算するには、FindObjectsOfType 関数を使用してカスタムスクリプトを作成する必要があります。

Physics プロファイラーモジュールには、スリープ中の Rigidbody コンポーネント数は表示されません。これらは、物理システムに関与していないコンポーネントであるため、プロファイラーは処理しません。Rigidbody コンポーネントのスリープに関する詳細は リジッドボディ を参照してください。

物理パフォーマンスの問題を理解する

物理シミュレーションは、メインロジックの更新ループから独立した固定された頻度の更新サイクルで実行され、呼び出しごとに Time.fixedDeltaTime を使ってのみ時間を進めることができます。これは UpdateFixedUpdate の違いと似ています。詳細は Time のドキュメントを参照してください。

物理演算やグラフィックスフレームが多く使用され処理に時間がかかる場合、Physics プロファイラーはフレームごとに複数の物理演算シミュレーションを呼び出さなくてはなりません。つまり、リソースに負荷がかかっているフレームにさらに時間とリソースがかかります。Maximum Allowed Timestep 値 (Edit > Project Settings > Time で設定できます) のために、物理演算シミュレーションが一時的に停止する原因となる可能性があります。

これをプロジェクトで検出するには、CPU Usage プロファイラーモジュール を選択し、Hierarchy ビューの Overview セクションで Physics.Processing または Physics.Simulate の呼び出し数を確認します。

CPU Usage プロファイラー で Calls 行で値が 2 を示すもの
CPU Usage プロファイラー で Calls 行で値が 2 を示すもの

この図では、Calls の列の数値 2 は、物理演算のシミュレーションが最近の論理フレームで 2 回呼び出されたのを表しています。

呼び出し回数が 10 に近い場合は、問題を示唆している場合があります。最初の解決策として、物理演算シミュレーションの頻度を減らします。問題が続く場合は、物理システムがゲーム時間に追いつくために多くのシミュレーションの呼び出しをする前に、何がフレームの負荷が高くなる原因となっているかを確認します。ときには、シーンで負荷の高いグラフィックスフレームがあると、後に物理演算シミュレーションがより多く呼び出される原因になることがあります。

シーンの物理演算シミュレーションのさらに詳しい情報を得るには、モジュールの詳細ペインの上部にある検索ボックスを選択し、Physics.Processing を検索します。次に、ペインの右上のドロップダウンから Calls を選択します。すると、シーンを更新するために実行する物理エンジンのタスク名が表示されます。最もよく見かける名前は以下の 2 つです。

  • Pxs: ‘PhysX solver’ を短縮した名称。重なったボディーの接触の解除も含め、ジョイントに必要な物理システムタスクです。
  • ScScene: シーンの更新、ブロードフェーズとナローフェーズの実行、Rigidbody コンポーネントの統合など (力と衝動で空中にボディーを移動) のタスクに使用されます。2 フェーズ衝突の検知に関する定義に関しては、Steven M. LaValle’s work on Planning Algorithms を参照してください。

古い Physics プロファイラーモジュール

Legacy モードに切り替えると、(古いバージョンの Unity のデフォルトモジュールだった) 古いバージョンの Physics 2D Profiler モジュールを表示できます。これを行うには、Physics プロファイラーモジュールの詳細ペインの右上にあるドロップダウンメニューから Legacy を選択してください。

このモードでは、古いバージョンの Unity で保存されたプロファイラーデータをロードして調査することができます。Unity の新しいバージョンでキャプチャされたデータを調査する時にこのモードに切り替えると、表示されるデータが信頼性の低い不正確なものになります。常に Current モードを使用して Phisics プロファイラーデータを確認する必要があります。

Legacy モードでの CPU Usage プロファイラー
Legacy モードでの CPU Usage プロファイラー
統計  説明 
Active Dynamic キネマティック以外のアクティブなリジッドボディコンポーネントの数。アクティブなリジッドボディとは、スリープ状態 ではないものを指します。
Active Kinematic アクティブな Kinematic Rigidbody コンポーネントの数。キネマティックリジッドボディは、MovePosition または MoveRotation がフレームで呼び出されるとアクティブになり、次のフレームでもアクティブのままです。

ノート: Unity は、フレームごとに複数回アタッチされるジョイントを持つ Kinematic Rigidbody コンポーネントを処理する場合があり、これは表示される値に影響します。
Static Colliders ゲームオブジェクトまたはその親ゲームオブジェクトに Rigidbody コンポーネントがアタッチされていないゲームオブジェクトの Collider コンポーネントの数。

Rigidbody コンポーネントを持つ Collider コンポーネント (ゲームオブジェクトまたは親ゲームオブジェクトの) は、静的コライダーとしてカウントされません。これらは複合コライダーと呼ばれます。複合コライダーは、同じゲームオブジェクトに設定されたすべてのコライダーを Rigidbody コンポーネントとするよりも、1 つにまとめた複数のコライダーを便利に設定することができます。
Rigidbody 物理演算システムが処理する Rigidbody コンポーネントの数。コンポーネントのスリープ状態には関係ありません。
Trigger Overlaps 重複するトリガー数 (ペア数)
Active Constraints 物理演算システムが処理するプリミティブな制約の数。制約は、衝突の反応と同様、ジョイントの構成ブロックとして使用されます。例えば、ConfigurableJoint の線状や回転の自由になる度数を制限するのに、制限ごとのプリミティブな制約がかかわっています。
Contacts シーン内のすべてのコライダーの接触ペアの総数。トリガーが重複しているペアの数も含みます。1 つの接触は、接しているか重なるコライダーのペアのことです。ノート: Unity は、コライダーのペアの間の距離が特定の制限値 (ユーザーが設定可能) を下回ると、コライダーのペアごとに接触ペアを作成します。そのため、まだ触れたり重なったりしていなくても、Rigidbody コンポーネントに対して接触が発生することがあります。 詳細については、Collider.contactOffsetContactPoint.separation を参照してください。
Memory Profiler モジュール
2D Physics プロファイラーモジュール