ドットを使用せずに巨大なオブジェクトを同じ画面上に配置できますか? 壮大なシーンを伴うゲーム、特にルージュ風のゲームでは、画面いっぱいに数千匹のモンスターが登場することが多く、草を刈って画面をクリアするスリルが心に響くので、この種のゲームは非常に人気がありますが、その仕組みはどうなっているのでしょうか。
まず第一に、巨大な移動オブジェクトに対してパスファインディングを使用するのは現実的ではなく、マルチスレッドをサポートする A* Pathfinding Pro でさえ、わずか 300 ~ 500 個で深刻なフレーム落ちが発生し始めます。
テスト環境:
Unity 2022.3.9f1、URP 14.0.8
モデル頂点数は 1195、LOD1 頂点数は 858、LOD2 固定点数は 530 です。
PC:i7-13700KF + 3070 8G;
モバイル Android: Snapdragon 8 gen2;
PC での RVO 障害物回避テスト:
PC で Unity Editor をテストすると、わずか 5,000 人でゲームが 50 フレームにまで低下しました。先帝は事業を始める前に倒れました。CPU 側のパフォーマンス消費は主に RVO 障害物回避とフレームごとの KDTree 計算によるものですが、マルチスレッドの使用は大きな問題ではありません。最大のボトルネックは GPU です。
PC、5000人:
携帯電話では、Snapdragon 8 gen2 実機は 3,000 人を処理できなくなり、24 フレームに低下します。HybridCLR ホット アップデートは解釈と実行に使用されますが、AOT であっても 5 ~ 10 フレーム程度しか改善できません。
携帯電話、3000人:
アニメーション部分にはAnimatorが使えないのは間違いありません。スケルタル アニメーションの各フレームの頂点情報をテクスチャに書き込み、実行時にメッシュ レンダー + シェーダーを使用して頂点テクスチャから位置を読み取り、SRP が自動的にバッチ処理します。
LOD を使用します。
GPU に圧力がかかっているので、頂点を下げて GPU を冷却しましょう。LOD 関数を使用して、LOD1 頂点が 30%、LOD2 が 60% 削減されると、その効果は確かに顕著になります。
PC 側に 5,000 人がいると、フレーム数はほぼ 2 倍の約 100 フレームになります。
携帯電話には 3,000 人が使用しており、これはほぼ 2 倍となり、フレーム レートは 44 に達します。
それでおしまい? ?? これは複雑なゲーム ロジックを使用しないパフォーマンスであり、実際のプロジェクトでは大幅に削減されます。従来の方法では、数千人が画面を共有することは難しいだけでなく、数千人が共有することも難しいようです。
結論: 従来の方法では、数千人が画面を共有するレベルが限界なので、諦めてください。
ただし、障害物を回避するには RVO が依然として必要です。テスト プロジェクトは、オープン ソースの RVO2 C# バージョンに基づいて変更されています: GitHub - snape/RVO2-CS: Optimal Reciprocal Collision Avoidance (C#)
元の RVO には次の主な変更が加えられています。
1. Easy Threading を使用してRVO エージェントを並行して更新します。
2. エージェントを削除する機能を追加します。
3. エージェントの障害物回避の重み設定を増やします。たとえば、目標位置に到達したエージェントの重みを 0 に設定すると、他のエージェントによって混雑しなくなります。
4. 形状障害物、BoxObstacle、CircleObstacle、EdgeObstacle を追加します。
5. パフォーマンスの最適化。フレームごとに配列を作成する代わりに ArrayPool を使用します。
6. RVO.Vector2 は Unity Vector2 に変更され、元のバージョンの分母が 0 であることによって引き起こされる例外を回避するために RVO.Math が最適化されます。
RVO2 Unity 修正版: GitHub - sunsvip/UnityRVO2: Unity 用 RVO