サーバー上のすべてのNPC / AIオブジェクトを管理する方法は?


8

私は単純なMMOを作成しており、現在、複数のユーザーがお互いを確認し、一緒に移動できるようにサーバークライアントアーキテクチャを配置しています。今度は敵を追加します。

世界で管理する必要のある何百ものNPCオブジェクトを最適に処理する方法を論じている記事へのリンクがあるかどうか疑問に思っていました。私はいくつかの検索を行ったが、これが通常どのように行われるかについての多くの情報を見つけることができなかった。

私が考えることができる実装を構造化する2つの方法:

  1. すべてのインスタンス化されたNPCオブジェクトをリストに保持し、NPCスレッドがそれらを順番にループして、それぞれに処理および必要なアクションを実行する必要があるロジックがあるかどうかを確認します。このデザインのパフォーマンスが十分かどうかはわかりませんか?
  2. イベントベースのシステム。AI / Logicを処理するメソッドをNPCクラスで作成し、関連するイベントが通知されたときにこのメソッドが呼び出されるようにします(相互作用しないAI機能のタイマーで(ワンダリングなど)、またはパケットから外部にイベントを通知します)。ハンドラー(近くに移動するプレーヤー、または範囲内で攻撃するプレーヤー)。

これらのアプローチのどちらが正しい方法ですか?これを行う他の方法は何ですか?

回答:


5

いつものように、アーキテクチャは要件に依存します。あなたはいくつのmobを持っていますか?彼らのAIはどのくらい複雑ですか?それは何に反応しますか?どのくらいの頻度で状態が変化しますか?これらの質問に答えてください。そうすれば、何が欲しいのか、どうやってそれを得るのかについて、はるかによく理解できます。

一般的に、少なくとも何らかのイベントシステムが必要です。AIは通常、イベントに関して定義されます。「Aが発生したら、Bを実行してください」。実際のコードにイベントがない場合は、これらの定義を何らかの方法で変換する必要があります。

私の経験では、(他の回答が示唆しているように思われる)非常に単純なmobが少ない場合は、単純なループ実装で回避できます。たとえば、現在のゲームでは、数百の小さなインスタンスがあり、それぞれに最大10個のMobがあります。そして、これらの暴徒は非常に愚かです。99%のAIは1つの文で説明できます。この場合、単純なループで十分です。1秒に2回、新しいターゲット(およびまれな「スマート」mobのための他のいくつかのこと)をチェックします。

ただし、モブの数が増えたり、スマートになったりすると、単純なアプローチが機能しなくなります。AIが何らかの刺激に反応するためには、AIループ内でそれを検出するコードを記述する必要があります。例:あなたの暴徒が「プレイヤーに当たったときに」何かをするべきだとしましょう。ループアプローチでは、mobがヒットしたかどうかを判別する簡単な方法はありません。AIが実行されているときに、最後のティック以降に暴徒の健康状態が低下したこと、または暴徒が現在誰かの標的になっていることを確認できます。ただし、実際のヒットを検出するには、ハックに頼らなければなりません。たとえば、各ヒット情報をどこかに保存して、後でAIがアクセスできるようにします。

次に、何が起こっても、単純なループが常に実行されます。モブがたくさんいる場合、AIをできるだけ速く実行したいのですが、最速のコードはまったく実行されないコードです。アクティブでないMobがある場合は、AIを実行しないようにするか、散発的にのみ実行するようにします(さまようMob AIは、次に移動する場所を決定したときにのみ実行する必要があります)。

イベントベースのアプローチを使用すると、他のサブシステムにAIイベントを都合のよいときに送信させることができ、「ヒットの検出」の問題を排除できます。もちろん、一部のイベントではコードの検出が必要になります。最も悪名高い例は「アプローチ」イベントです。そして、何も起こらないときにループでAIルーチンを実行しないと、パフォーマンスが向上します。

ハイブリッドアプローチを使用することもできます。AIイベントをすぐに処理する代わりに、ある種のキューに詰め込むことができます。次に、AIルーチンが(ループで)実行されると、このキューからイベントが削除され、1つずつ処理されます。このアーキテクチャでは、AIのパフォーマンスは少し遅いかもしれませんが、より予測可能です。また、すべてのAIが単一のスレッドで実行されることを保証できます(そうでない場合は注意が必要です)。この種のループは、一部のイベントをスキップすることで簡単に調整することもできます(たとえば、各AI反復は、最新の3つのイベントのみを処理し、残りは破棄します)。または、イベントが優先され、AIが遅れていることが判明した場合、重要度の低いイベントは破棄されます。

全体として、「イベントキューでループする」アプローチがおそらく最も柔軟です。繰り返しますが、盲目的に「最高」として選択するだけではありません。最初に要件について考えてください。単純なアプローチの方が優れている場合があります。


この回答を完了するために、いつでもmobを追加したり、チェックループから削除したりできます。例えば。暴徒が何をしているかを観察する人がいない場合、NPCがその時に行うすべてのことをするのは論理的ではありません。多くのモブを簡単にフィルタリングして、重要なモブ(通常はプレイヤーに十分近いモブ)に更新が必要かどうかを確認するだけです
Ali1S232

「暴徒」は敵のグループですか、それとも1人の敵ですか?
Richard Marskell-Drackir、

「mob」は単一の敵です。この用語はMUD1のRichard Bartleによって造られたもので、「モバイル」の略です。他のオブジェクトとは対照的に、mobが移動するからです。
ネヴァーマインド

2

それはあなたが持っている敵の数と彼らがどれだけ活発になるかによります。

敵がたくさんいるが、ほとんどの場合そうしない場合は、イベントシステムの方が良いでしょう。通常、何かをしている敵がいる場合、ループはイベントシステムの複雑さを排除し、イベントが発生している場合は常にとにかく発火するため、ループが最適に機能する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.