マルチプレイヤースペース分割のための効率的なソリューション?


10

この質問は少しトリッキーですが、私はそれを明確にするように努めます。

私がオンラインゲーム(MMOスケールではない)を構築しているとしましょう。しかし、それは信頼できるサーバーアプローチで可能な限り多くのプレイヤーをサポートします。AIシミュレーションの敵がたくさんいる本当に大きな世界が欲しいです。

スペースを分割して処理の必要がないものを処理しないことにより、サーバーのCPUを節約するいくつかの戦略を知っています。ロードタイムと小さなトランジションを必要とする地域ですでに世界を分割しています。ローカルで(単独で、または数人の友人と一緒に)プレイするときにゲームプレイの品質を維持することが重要だと思います。プレイヤーが1つまたは2つ以上のリージョンにいるとは思わない。

問題は、リージョンがかなり大きくなり、一度に多くのNPCをシミュレートできることです。プレイヤーの経験に影響を与えずにこれをどのように処理しますか?地域ごとに1つのサーバーなどのアプローチは、この表には含まれていません。

私は主に敵の大群、さらには平和なNPCを保持するためのデータ構造を探しています。質問を完成させるために、車両が存在するため、リージョン内を移動するのがかなり速く、エリアを間引く「タイミング」に影響を与えることに注意してください。


物理サーバーは1つだけに制限されていますか?
Patrick Hughes

結局は違います。しかし、単純さと達成可能性の両方のために、今のところ、プロジェクトをこれ以上複雑にすることはできません:)
Grimshaw

簡単に始めましょう。「サーバー」ごとに複数の物理ボックスで動作するWoWのようなものは、それらの世界をグリッドに分割するだけであり、すべての更新は、あなたと同じボックスにいる人に基づいています。非常にシンプルで、調整が簡単で、うまく機能します。1つのボックスだけで処理を制御できます。
Patrick Hughes

私はあなたの見解に完全に同意します、そしておそらく私は私の質問で何かを見逃しました。ボックスのセルの右端に1人のプレーヤーがいて、右隣のセルの左端に別のプレーヤーがいる場合はどうなりますか?彼らはお互いを見るはずです!世界は、WoWのようなゲームを探し続けています。これは私が理解していないことです。効率的なまま、連続的なワールドグリッドを作成する方法はありますか?確かに、2つの「サーバー」のプレーヤーがお互いを見る必要がある状況があります:)
Grimshaw

1
そして、ええ、もしあなたがたくさんの物事とたくさんのプレイヤーの両方を持つことになるなら、あなたは本当にすべてがいつでもどこでもアクティブになるように計画する必要があります、その周りに魔法のような方法はありません。これが、MMOサーバーグループの単一のボックスが最大200〜500のプレーヤーにのみサービスを提供する理由であり、NPCのMMO AIが愚かに(別名、計算が安価)な理由です。
Patrick Hughes

回答:


5

私が理解していることから、サーバー上で何らかの物理が実行されていることになります。

その場合は、スペース分割以外のAI /物理学で利用可能なテクニックもあります。ほとんどからあまり明白でないものへ:

  • 優先度:プレーヤーと直接対話しないNPCは、リフレッシュレートを下げることでCPU時間を短縮できます。優先度キューを使用して、最初から最後まで優先度の高い実行キューを実行できますが、他のキューは、各サイクルでキューの1 / 2、1 / 4、または1/8だけを実行します。これにより、各オブジェクトが特定の時点で確実に実行されるようにしますが、CPUを消費する回数を減らすことができます。
  • 物理演算も下げることができます(ローミング中および視界から離れている間は、衝突ボックスと球のみを使用できます)。
  • プレイヤーが遠く離れているときに、NPCと環境に非常に基本的な動作を割り当てることにより、AI /シミュレーションを簡素化します。通常、狩猟、採集、農業ではなく、ローミングまたは敵のスキャンを行います...
  • 一部の物理とAIもクライアントに委任できます。サーバーのCPUが本当に不足している場合は、オブジェクトに部分的に解決済みのタグを付けることができ、クライアントはそれらのオブジェクトの物理と位置をローカルで調整します(フローティングNPCを回避するため)。クライアントはAIの実行においてある程度の責任を負うことができます(プレイヤーとの戦闘中、ターゲットプレイヤーのデバイスは直接攻撃NPCを実行できます)
  • プレイヤーにとっては、サーバー上で物理を下げることもでき、衝突解決においてクライアントはより多くの責任を負うことになります。例:車両でオブジェクトにぶつかると、サーバーは衝突ボックスでの衝突のみを解決し、衝突の可能性があるものとしてオブジェクトにタグを付けます。クライアントは、オブジェクトにタグが付けられ、解決策が適切であると思われる場合にそれを受け入れるタイムスタンプとともに、解決策をサーバーに送信します。

これらのメカニズムを実装したら、必要な量と頻度を決定できます。これのすばらしい点は、後でクライアントアプリの代わりにいくつかのタスクを引き継ぐことができるサーバーをいくつか追加できることです。

もちろん、近似された衝突検出はいくつかの異常を作成しますが、時々精度を上げることでそれらを解決することができます。

また、物理学に関しては、OpenCLやCUDAのようなGPGPUシステムをサポートするlibsを調べて、どちらかをサポートするサーバーにアクセスできるようにする必要があります。


リージョンのスペース分割と優先度の更新を組み合わせるのはまさに私が必要としていることであり、少量のプレイヤーに最適であり、多くのエリアがロードされている場合でも最適化されます。ありがとう。
グリムショー

@DevilWithin役立つはずです。クライアント側で変更を加える必要はありません。また、回答にいくつかの詳細を追加しました。
コヨーテ

簡素化されたAIは素晴らしいアイデアです。NPCはプレイヤーとはかけ離れていますが、ほとんどの場合、移動以外に何もする必要はありません。つまり、私は、彼らが世界を歩き回るようにするために、彼らが何をしているのかを1分おきなどに概算できるだけだということを意味します。
グリムショー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.