Physics (物理演算) プロファイラーはシーンで物理エンジンが処理する物理演算に関する統計を表示します。この情報は、シーンにおける物理特性に関連するパフォーマンスの問題や予期せぬ矛盾を診断し解決するのに役立ちます。 アプリケーションでの物理演算のデバッグに関する詳細は、物理演算デバッグの可視化 を参照してください。
Physics プロファイラーモジュールのチャートは、アプリケーションで物理演算に使用した時間を追跡します。タイミングは 7 つのカテゴリに分けられます。チャートのカテゴリの順序を変更するには、カテゴリをチャートの凡例にドラッグアンドドロップします。カテゴリの色の付いた凡例をクリックして、表示を切り替えることもできます。
チャートをクリックすると、チャートの下のモジュールの詳細ペインで各チャートカテゴリの正確な数値を見ることができます。
チャート | 機能 |
---|---|
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.contactOffset と ContactPoint.separation を参照してください。 |
プロファイラーに表示される数は、シーン内の物理演算コンポーネントを持つゲームオブジェクトの正確な数と一致しない場合があります。これは、Physics コンポーネントの中には、それに影響する他のコンポーネント (アタッチした Joint コンポーネントなど) に応じて異なる速度で処理されるものがあるためです。特定の Physics コンポーネントがアタッチしたゲームオブジェクトの正確な数を計算するには、FindObjectsOfType 関数を使用してカスタムスクリプトを作成する必要があります。
Physics プロファイラーモジュールには、スリープ中の Rigidbody コンポーネント数は表示されません。これらは、物理エンジンに関与していないコンポーネントであるため、Physics プロファイラーによって処理されません。Rigidbody コンポーネントのスリープに関する詳細は リジッドボディ概要 を参照してください。
物理シミュレーションは、メインロジックの更新ループから独立した固定された頻度の更新サイクルで実行され、呼び出しごとに Time.fixedDeltaTime を使ってのみ時間を進めることができます。これは Update と FixedUpdate の違いと似ています。詳細は Time のドキュメントを参照してください。
物理演算やグラフィックスフレームが多く使用され処理に時間がかかる場合、Physics プロファイラーはフレームごとに複数の物理演算シミュレーションを呼び出さなくてはなりません。つまり、リソースに負荷がかかっているフレームにさらに時間とリソースがかかります。Maximum Allowed Timestep 値 (Edit > Project Settings > Time で設定できます) のために、物理演算シミュレーションが一時的に停止する原因となる可能性があります。
これをプロジェクトで検出するには、CPU Usage プロファイラーモジュール を選択し、Hierarchy ビューの Overview セクションで Physics.Processing または Physics.Simulate の呼び出し数を確認します。
この図では、Calls の列の数値 1 は、物理演算のシミュレーションが最近の論理フレームで 1 回呼び出されたのを表しています。
呼び出し回数が 10 に近い場合は、問題を示唆している場合があります。最初の解決策として、物理演算シミュレーションの頻度を減らします。問題が続く場合は、物理エンジンがゲーム時間に追いつくために多くのシミュレーションの呼び出しをする前に、何がフレームの負荷が高くなる原因となっているかを確認します。ときには、シーンで負荷の高いグラフィックスフレームがあると、後に物理演算シミュレーションがより多く呼び出される原因になることがあります。
シーンの物理演算シミュレーションのさらに詳しい情報を得るには、モジュールの詳細ペインの上部にある検索ボックスを選択し、Physics.Processing を検索します。次に、ペインの右上のドロップダウンから Show Calls を選択します。すると、シーンを更新するために実行する物理エンジンのタスク名が表示されます。最もよく見かける名前は以下の 2 つです。