物理パフォーマンスおよび最適化
はじめに
リアルタイムでのインタラクションが発生するマルチプレイヤーゲームの設定では、プレイヤーに可能な限りスムーズな体験を提供するために、ゲームのパフォーマンスが非常に重要です。
必ずしも原因ではありませんが、物理処理はこれらの状況でボトルネックとなる可能性がよくあります。
プロファイリング
何か作業を進める前に、問題が実際に物理システムによって引き起こされているかどうかを確認する必要があります。
Quantumグラフプロファイラー
Quantum Graph Profiler
は、すべてのシステムのパフォーマンス、グラフィックス、Unityスクリプトをプロファイリングするためのツールです。主に、Unityに関連する何かがパフォーマンスの問題を引き起こしているかどうかを判断するのに役立ちます。
タスクプロファイラー
このツールは、Quantumシミュレーション内の各システムが実行にどれだけの時間を要するかを評価するために使用されます。
一般的に、これらのツールを使用して物理関連の問題が検出されない場合、直面している問題はおそらく物理に起因するものではありません。
Quantumでのプロファイリングに関する詳細は、プロファイリングを参照してください。
ブロードフェーズの最適化
物理エンジンは、システムセットアップ内のそれぞれのシステムによってスケジュールされたタスクのシーケンスです。各フレームで、これらのタスクは次のように進行します:
シミュレーション内の物理コンポーネントを持つエンティティのために物理エントリを作成し、エントリを収集します。
ブロードフェーズ:詳細に評価するための潜在的に重なっているペアを検出します。このステップは、O(n²)のブルートフォース検出を避けるために重要です。
ナローフェーズ:前のブロードフェーズの候補を評価し、どれが重なっているかを定義します。このステップは、ブロードフェーズによってフィルタリングされた潜在的な候補の数に対して線形にスケールします。このステップでは、コストのかかる数学計算が行われます。
繰り返しソルバーを使用して、速度と位置の制約を解決します。
力と速度を統合し、静止物体を検出し、以前のブロードフェーズクエリを解決します。
これらのタスクのほとんどは、エントリの数またはそれらの間の相互作用の量に対して線形にスケールします。
したがって、動的エントリの数を減らす方法の一つは、動かない動的コライダーを静的コライダーに変更することです。
静的コライダーに関する情報は、静的コライダーを参照してください。
別の方法は、物体間の相互作用の量を減らすことであり、例えば物理レイヤーやクエリオプションを使用することです。
3Dおよび2Dの衝突マトリックスはUnityからインポートされ、Simulation Config
で利用できます。

ワールドとバケットサイズ
物理設定に関する詳細情報は、設定を参照してください。
World Size
は、QuantumMapData
コンポーネントによってベイクされるMap
アセットに見られるフィールドで、物理エンジン内のプレイ可能エリアを定義します。
マップは、Buckets
と呼ばれる一連のセクションに分割されます。これらは、ブロードフェーズおよびナローフェーズのクエリを解決するために使用されます。
ワールドサイズ
World Size
は、ゲームのプレイ可能エリアのサイズにできるだけ近い値に設定する必要があります。これにより効率が向上します。

最初の画像では、World Size
が実際のゲームプレイで使用されるエリアよりも大きく、バケツが均等に間隔を取られておらず、無駄になっています。2番目の画像では、オブジェクトがワールドエリア内に均等に配置されています。
必要以上に多くのバケットを追加してもパフォーマンスは向上せず、バケットが少なすぎると評価すべきエントリが多くなります。最初または最後のバケットにエントリが多すぎると、パフォーマンスに大きな影響を与えます。
パフォーマンスを評価するためには、タスクプロファイラー
を参照し、ご自身の事例に最適な値に基づいて調整してください。
注意:ワールドサイズの制限外にあるものは、最初または最後のバケット(近い方)に含まれると見なされます。
バケットの細分化
バケットの細分化は、通常の物理クエリをより効率的にするために使用されます。そのため、ゲームが通常のクエリを使用しない場合、たとえばブロードフェーズクエリのみを使用する場合は、細分化のカウントを0に設定できます。
それ以外の場合は、QuantumMapData
コンポーネントで提供されるデフォルト値がほとんどのケースに十分です。
バケッティング軸
ワールドサイズの細分化における軸は、ゲーム内のオブジェクトの分布に応じてパフォーマンスを向上させることができます。

左側の画像では、いくつかのバケツに5つのエントリがありますが、右側のバケツにはわずか3つのエントリしかありません。
したがって、この画像の場合、バケッティング軸
は水平に設定するべきです。これは、物理ボディがバケット全体により均等に広がるためです。
注意:この例のように、エントリがわずかしかない場合、変更の影響は最小限ですが、エントリが数百または数千にスケールアップされた場合には、確実に重要です。
三角形セルサイズ
注意:これは3Dゲームにのみ関連します。
三角形セルサイズは、3D静的コライダーの三角形が分割されるセルのサイズを定義します。動的エンティティと静的メッシュ間の衝突は、対応するセルおよび隣接するセルでのみ評価されます。
これを最適化するためには:
- セルごとの三角形の数が多くなりすぎることを避ける。
- セルの数が多すぎることを避ける。
地形やメッシュコライダーのために、三角形密度を合理的にすることを目指してください。これは、物理エンジンのパフォーマンスに重要な役割を果たします。このため、メッシュによっては、表示用と同じメッシュを使用するのではなく、コライダー用に簡略化された二次メッシュを作成することを検討してもよいでしょう。
これを可視化するには、QuantumGameGizmosSettings
の関連フィールドを有効にしてください。

シミュレーション実行の最適化
Quantumの物理エンジンは、多様な機能のために複数のスケジュール済みステップを実行しますが、ゲームに応じてすべてのステップが必要というわけではありません。
これらの機能は、SimulationConfig
アセット内で個別に無効にすることができます。

静止物体
ゲーム内に長時間動く必要がないオブジェクトがある場合、それらはスリープ状態にし、力、速度、統合、および衝突検出をスキップします。このオプションは、SimulationConfig
アセット内で有効にすることができます。

ソルバー反復
SimulationConfig
アセット内のSolver Iterations
フィールドは、物理エンジンによって使用される制約(衝突やジョイントなど)を解決するために使用される反復回数を表します。
デフォルト値は4で、通常はほとんどのケースで問題ありません。ただし、必要な精度に応じて増減させることができます。
レイキャストの最適化
毎フレーム多くのレイキャストを実行する場合、それらを適切に最適化することが重要です。
具体的には:
レイヤーマスクを追加して、重要でないオブジェクトとの不必要な衝突評価を避けます。
レイキャストの距離をできるだけ小さくして、不必要な衝突評価を避けます。
最初の衝突のみが重要な場合は、
RaycastAll
の代わりにRaycast
を使用します。レイキャストメソッドで
QueryOptions
を利用して、重要でないものにヒットしないようにします。
QueryOptions
の詳細については、クエリを参照してください。
ブロードフェーズクエリ
前述の通り、ブロードフェーズクエリはゲーム内のクエリを最適化するために使用できます。詳細については、ブロードフェーズクエリを参照してください。
Back to top