Physics (物理演算) プロファイラーはシーンで物理エンジンが処理する物理演算に関する統計を表示します。この情報は、シーンにおける物理特性に関連するパフォーマンスの問題や予期せぬ矛盾を診断し解決するのに役立ちます。
プロパティー | 機能 |
---|---|
Active Dynamic | スリープ状態ではない Kinematic 以外の Rigidbody コンポーネントの数 |
Active Kinematic | スリープ状態ではない Kinematic な Rigidbody コンポーネントの数。ジョイントが設定された Kinematic な Rigidbody コンポーネントは、フレームにつき複数回処理されることがあり、これは表示回数に反映されます。Kinematic な Rigidbody は、MovePosition または MoveRotation がフレームで呼び出されると有効になり、次のフレームでも有効に保たれます。 |
Static Colliders | それ自体、またはその親に Rigidbody コンポーネントがアタッチされていないゲームオブジェクトの Collider コンポーネントの数。そのゲームオブジェクト、またはその親が Rigidbody コンポーネントを持つ場合は、コライダーを Static Collider としてではなく複合コライダーとして数えます。このようにすることによって、同じゲームオブジェクトに設定されたすべてのコライダーを Rigidbody コンポーネントとするよりも、1 つにまとめた複数のコライダーを便利に設定することができます。 |
Rigidbody | 物理演算エンジンが処理する Rigidbody コンポーネントの数。コンポーネントのスリープ状態には関係ありません。 |
Trigger Overlaps | 重複するトリガーの数 (ペアの数) |
Active Constraints | 物理演算エンジンが処理するプリミティブな制約の数。制約は、衝突の反応と同様、ジョイントの構成ブロックとして使用されます。例えば、ConfigurableJoint の線状や回転の自由になる度数を制限するのに、制限ごとのプリミティブな制約がかかわっています。 |
Contacts | トリガーが重複しているペアの数も含めて、シーン内のすべてのコライダーの接触ペアの総数。コライダーのペアの間の距離が特定の制限値 (ユーザーが設定可能) を下回ると、コライダーのペアごとに接触ペアが作成されます。そのため、まだ接触または重複していなくても、Rigidbody コンポーネントに対して接触が発生することがあります。 詳細については、Collider.contactOffset およびContactPoint.separation を参照してください。 |
ノート
数値は、シーン内で Physics コンポーネントを持つゲームオブジェクトの正確な数と一致していない可能性があります。これは、Physics コンポーネントの中には、それに影響する他のコンポーネント (アタッチした Joint コンポーネントなど) に応じて異なる速度で処理されるものがあるためです。特定の Physics コンポーネントがアタッチしたゲームオブジェクトの正確な数を計算するには、FindObjectsOfType 関数を使ってカスタムスクリプトを書きます。
Physics プロファイラーには、スリープ中の Rigidbody コンポーネント数は表示されません。 これらは、物理エンジンに関与していないコンポーネントであるため、Physics プロファイラーによって処理されません。Rigidbody コンポーネントのスリープに関する詳細は リジッドボディの概要:スリープ を参照してください。
物理シミュレーションは、メインロジックの更新ループから独立した固定周波数更新サイクルで実行され、呼び出しごとに Time.fixedDeltaTime
を使ってのみ時間を進めることができます。これは Update()
と FixedUpdate()
の違いと似ています (詳細は Time Manager のドキュメントを参照してください)。
物理演算やグラフィックスフレームが多く使用され処理に時間がかかる場合、Physics プロファイラーはフレームごとに複数の物理演算シミュレーションを呼び出さなくてはなりません。これは、リソースに負荷がかかっているフレームにさらに時間とリソースがかかり、Maximum Allowed Timestep 値 (Edit > Project Settings > Time で設定できます) のために、物理演算シミュレーションが一時的に停止する原因となります。
CPU Usage プロファイラー を選択して、 Overview で Physics.Processing や Physics.Simulate の呼び出し数を確認することによって、プロジェクト内でこの問題を検知できます。
この図では、Calls の列の数値 1 は、物理演算のシミュレーションが最近の論理フレームで 1 回呼び出されたのを表しています。
呼び出し回数が 10 に近いと問題を示唆している場合があります。最初の解決策として、物理演算シミュレーションの頻度を減らします。問題が続く場合は、Physics Profiler がゲーム時間に追いつくためにそれほど多くのシミュレーションの呼び出しをする直前の、負荷の高いフレームの原因を確認します。ときには、シーンで負荷の高いグラフィックスフレームがあると、後に物理演算シミュレーションがより多く呼び出される原因になることがあります。
シーンの物理演算シミュレーションのさらに詳しい情報を得るには、上のスクリーンショットに表示されているように、三角の矢印をクリックして Physics.Processing を広げます。こうすると、シーンを更新するために実行された物理エンジンの実際のタスク名が表示されます。最もよく見かける名前は以下の 2つです。
Pxs ‘PhysX solver’ を短縮した名称。重なったボディーの接触の解除も含め、ジョイントに必要な物理エンジンタスクです。
ScScene ブロードフェーズとナローフェーズを実行し、ボディーを統合するなど (力と衝動で空中にボディーを移動)、シーンの更新に必要なタスクに使用されます。2フェーズ衝突の検知に関する定義に関しては、Steven M. LaValle’s work on Planning Algorithms を参照してください。