Physics プロファイラーモジュールは、プロジェクトのシーン内で物理演算システムによって処理された物理演算に関する情報を表示します。この情報は、プロジェクトのシーンにおける物理演算に関連するパフォーマンス問題や予期せぬ矛盾の診断と解決に役立てることができます。Physics Debug の可視化 により、アプリケーションの物理演算の問題をさらに詳しくデバッグして理解することもできます。
Profiler ウィンドウを開くには、メニュー: Window > Analysis > Profiler の順に移動します。
Physics プロファイラーモジュールのチャートは、アプリケーションで物理演算に使用した時間を記録します。タイミングはチャートのカテゴリごとに分かれます。チャートのカテゴリの順序を変更するには、カテゴリをチャートの凡例にドラッグします。カテゴリの色の付いた凡例をクリックして、表示を切り替えることもできます。チャートをクリックすると、チャートの下のモジュールの詳細ペインで各チャートカテゴリの正確な数値を見ることができます。
| Chart | 機能 |
|---|---|
| Physics Used Memory | 物理演算モジュールが使用したメモリの総量 |
| Active Dynamic Bodies | スリープ 状態でない Rigidbody コンポーネントと ArticulationBody コンポーネントの数。 |
| Active Kinematic Bodies | アクティブな Kinematic Rigidbody コンポーネントの数。Kinematic Rigidbody は、フレーム内で MovePosition または MoveRotation が呼び出されるとアクティブになり、次のフレームでもアクティブのままです。 ノート: Unity は、フレームごとに複数回アタッチされるジョイントを持つ Kinematic Rigidbody コンポーネントを処理する場合があり、これは表示される値に影響します。 |
| Dynamic Bodies | Rigidbody コンポーネントと ArticulationBody コンポーネントの数。 |
| Overlaps | オーバーラップイベントの数。オーバーラップイベントは、コライダー が互いに重なり合うときに発生します。 |
| Trigger Overlaps | トリガーコライダーとのオーバーラップイベントの数 (ペアでカウント)。 |
| Discreet Overlaps | Unity が離散型衝突判定を使用して解決したオーバーラップイベントの数。 |
| Continuous Overlaps | Unity が連続型衝突判定を使用して解決したオーバーラップイベントの数。 |
| Physics Queries | Raycast や Shapecast などの物理演算クエリの総量。 |
Physics プロファイラーモジュールをクリックすると、モジュールの詳細ペインにプロジェクトの物理演算に関する詳細情報が表示されます。
| 統計 | 説明 | |
|---|---|---|
| Physics Used Memory | 物理演算モジュールが使用したメモリの総量。 | |
| Dynamic Bodies | Rigidbody コンポーネントと ArticulationBody コンポーネントの数。 | |
| ArticulationBody | シーン内の ArticulationBody コンポーネントの数 | |
| Active Dynamic Bodies | スリープ 状態でない Rigidbody コンポーネントと ArticulationBody コンポーネントの数。 | |
| Active Kinematic Bodies | アクティブな Kinematic Rigidbody コンポーネントの数。Kinematic Rigidbody は、フレーム内で MovePosition または MoveRotation が呼び出されるとアクティブになり、次のフレームでもアクティブのままです。 ノート: Unity は、フレームごとに複数回アタッチされるジョイントを持つ Kinematic Rigidbody コンポーネントを処理する場合があり、これは表示される値に影響します。 |
|
| Static Colliders | Rigidbody または ArticulationBody コンポーネントを持たない コライダー の数 | |
| Colliders Synced | Transform と同期しているコライダーの数。 | |
| Rigidbodies Synced | Transform と同期している Rigidbody コンポーネントの数。 | |
| Physics Queries | Raycast や Shapecast などの物理演算クエリの総量。 | |
| Total Overlaps | オーバーラップイベントの数。オーバーラップイベントは、コライダーが互いに重なり合うときに発生します。 | |
| Discreet | Unity が離散型衝突判定を使用して解決したオーバーラップイベントの数。 | |
| Continuous | Unity が連続型衝突判定を使用して解決したオーバーラップイベントの数。 | |
| トリガー | トリガーコライダーとのオーバーラップイベントの数 (ペアでカウント)。 | |
| 更新 | Unity が Contact Modification API を使用して修正したオーバーラップイベントの数。 | |
| Broadphase Adds/Removes | ブロードフェーズアルゴリズム によって追加または削除されたコライダーの総数。 | |
| Narrowphase Touches | 前のフレーム以降に失われた、または新しく発生した衝突イベントの総量。 | |
プロファイラーに表示される数は、シーン内の物理演算コンポーネントを持つゲームオブジェクトの正確な数と一致しない場合があります。Physics コンポーネントの中には、それに影響する他のコンポーネント (アタッチした Joint コンポーネントなど) に応じて異なる速度で処理されるものがあるためです。特定の Physics コンポーネントがアタッチされたゲームオブジェクトの正確な数を計算するには、FindObjectsOfType 関数を使用してカスタムスクリプトを作成する必要があります。
Physics プロファイラーモジュールには、スリープ中の Rigidbody コンポーネント数は表示されません。これらのコンポーネントは物理演算システムと相互作用しないため、プロファイラーは処理しません。Rigidbody コンポーネントのスリープに関する詳細は リジッドボディ に関するドキュメントを参照してください。
物理演算シミュレーションは、メインロジックの更新ループから独立した固定頻度の更新サイクルで実行され、呼び出しごとに Time.fixedDeltaTime を使ってのみ時間を進めることができます。これは、Update と FixedUpdate の違いに似ています。詳細は Time ウィンドウ に関するドキュメントを参照してください。
物理演算やグラフィックスフレームが多く使用され処理に時間がかかる場合、Physics プロファイラーはフレームごとに複数の物理演算シミュレーションを呼び出さなくてはなりません。つまり、すでにリソースに負荷がかかっているフレームは、さらに多くの時間とリソースを必要とします。これにより、物理演算シミュレーションが Maximum Allowed Timestep の値に従って一時的に停止する場合があります。 この値は、Project Settings ウィンドウの (メニュー: Edit > Project Settings > Time) で設定できます。
これをプロジェクトで検出するには、CPU Usage プロファイラーモジュール を選択し、Hierarchy ビューの Overview セクションで Physics.Processing または Physics.Simulate の呼び出し数を確認します。
図の Calls 列の数値 2 は、最近の論理フレームで物理演算のシミュレーションが 2 回呼び出されたことを表しています。
呼び出し数が 10 に近い場合は、問題が発生している可能性があります。1 つ目の解決策は、物理演算シミュレーションの頻度を減らすことです。問題が続く場合は、物理演算システムがゲーム時間に追いつくために多くのシミュレーション呼び出しを使用しないように、フレームの負荷の原因を確認します。シーンで負荷の高いグラフィックスフレームがあると、後で物理演算シミュレーションがより多く呼び出される原因になることがあります。
シーンの物理演算シミュレーションに関する詳しい情報を得るには、モジュールの詳細ペインの上部にある検索フィールドを選択し、Physics.Processing を検索し、右上のドロップダウンから Calls を選択します。すると、シーンを更新するために実行された物理エンジンの実際のタスク名が表示されます。最も多く見られる名前は以下の 2つです。
Legacy モードに切り替えると、(古いバージョンの Unity のデフォルトモジュールだった) 古いバージョンの Physics プロファイラーモジュールを表示できます。これを行うには、Physics プロファイラーモジュールの詳細ペインの右上にあるドロップダウンメニューから Legacy を選択してください。
このモードでは、古いバージョンの Unity で保存されたプロファイラーデータをロードして調査することができます。Unity の新しいバージョンでキャプチャされたデータを調査する際にこのモードに切り替えると、表示されるデータが信頼性の低い不正確なものになります。新しい Physics プロファイラーデータを調査するには、常に Current モードを使用してください。
| 統計 | 説明 |
|---|---|
| Active Dynamic | キネマティック以外のアクティブな Rigidbody コンポーネントの数。アクティブなリジッドボディとは、スリープ状態 ではないものを指します。 |
| Active Kinematic | アクティブな Kinematic Rigidbody コンポーネントの数。Kinematic Rigidbody は、フレーム内で MovePosition または MoveRotation が呼び出されるとアクティブになり、次のフレームでもアクティブのままです。 注意Unity は、フレームごとに複数回アタッチされるジョイントを持つ Kinematic Rigidbody コンポーネントを処理する場合があり、これは表示される値に影響します。 |
| Static Colliders | ゲームオブジェクトまたはその親ゲームオブジェクトに Rigidbody コンポーネントがアタッチされていないゲームオブジェクトの Collider コンポーネントの数。 Rigidbody コンポーネントを持つゲームオブジェクトまたは親ゲームオブジェクトの Collider コンポーネントは静的コライダーとしてカウントされません。これらは複合コライダーと呼ばれます。複合コライダーは、同じゲームオブジェクトに設定されたすべてのコライダーを Rigidbody コンポーネントとするのではなく、複数のコライダーを 1 つにまとめて扱いやすくします。 |
| Rigidbody | 物理演算エンジンが処理する Rigidbody コンポーネントの数。コンポーネントのスリープ状態には関係ありません。 |
| Trigger Overlaps | 重複するトリガーの数 (ペアの数) |
| Active Constraints | 物理演算エンジンが処理するプリミティブコンストレイントの数。コンストレイントは、衝突反応と同様、ジョイントの構成ブロックとして使用されます。例えば、ConfigurableJoint の直線運動や回転できる度数の制限には、各制限にプリミティブコンストレイントが必要です。 |
| Contacts | シーン内のすべてのコライダーの接触ペアの総数。トリガーがオーバーラップしたペアの数も含まれます。接触とは、コライダーのペアが触れるまたは重なることを指します。注意Unity は、コライダーのペアの間の距離が特定の制限値 (ユーザーが設定可能) を下回ると、コライダーのペアごとに接触ペアを作成します。そのため、まだ触れたり重なったりしていなくても、Rigidbody コンポーネントに接触が発生することがあります。詳しくは、Collider.contactOffset および ContactPoint.separation のドキュメントを参照してください。 |