オフスクリーンAIを処理する良い方法は?


16

例えば:

  • 世界に10の部屋があるとしましょう。
  • そして、世界には10のエンティティが住んでいるとしましょう。
  • また、各エンティティには独自の「毎日のルーチン」があり、部屋で特定のアクションを実行し、部屋間を移動することもできます。

プレーヤーは一度に1つの部屋にしか入ることができないので、他のエンティティが他の部屋で画面外で実行しているアクションを追跡する良い方法は何ですか?

  1. 最も簡単なオプションは、すべてのフレームで10個のエンティティのそれぞれをチェックし、それらの位置/状態をチェックして、エンティティがいつでもプレイヤーがいる部屋にいるかどうかを判断することです。 (ただし、これは、特に部屋/エンティティの量が増加するにつれて、本当にリソースが重いと感じます。)
  2. 別のオプションは、ゲームの開始から経過した時間を追跡することです。各エンティティは、そのパターンがプレーヤーのいる部屋と交差するかどうかをチェックします。エンティティはこの特定の時間に同じ部屋にあると想定され、プレイヤーが現在の部屋と交差しないパターンのエンティティは、プレイヤーがパターンと交差する部屋に入るまで何もせず、その時点でのみかどうかを計算しますレンダリングする必要があります。(しかし、部屋と対話する場合、その時点での位置を決定するために、ルートと交差する部屋の状態を常に確認する必要がありますが、それはそれほど素晴らしいことではありません。)

  3. 私がやってきた3番目のオプションは、まずプレイヤーの場所と交差するルートのみを見て(前述のとおり)、次に部屋に入ると、プレイヤーがその部屋にいるかどうかを確認し、そうでない場合は部屋の状態と次の部屋に進むのにどれくらい時間がかかりますか。たとえば、管理人のNPCが部屋に入り、部屋の状態を確認し、プレイヤーによるこぼれがあることを確認し、それを掃除するのにかかる時間と経路がかかる時間を計算します。時間は次の部屋に入るためです。プレイヤーが部屋にいるかどうかを確認するだけです。レンダリングのためのNPCの正確な位置は、プレイヤーが部屋に入ったときにのみ計算されます。

しばらくブレインストーミングした後、私は3番目のオプションに来ましたが、おそらくこれらのようなものを処理するための既知のまたはより良い方法があるのだろうかと思いましたか?


1
この質問は、Project Zomboidというゲームのために読んだ開発ブログを思い出させます。
サムライ

回答:


12

非常に簡単なアプローチは、「AI Level of Detail」を使用することです。大まかに言うと、これはAIがプレーヤー/カメラに近いほど頻繁に更新されることを意味します。また、特に遠くにあるAI計算の複雑さを減らすこともできます。パス検索用。結局のところ、プレイヤーがキャラクターをよく見ることができないか、まったく見ることができない場合、キャラクターを最高の精度でシミュレートすることに多大な労力を費やす意味はありません。

あなたの例では、プレイヤーがいる部屋が最高の精度を得るかもしれません(AIはすべてのフレーム、フル解像度を更新します)。隣接する部屋の精度が次に高くなる可能性があります(10ティックごとに更新し、パスのスムージングとアニメーションを削除します)。他のすべての部屋は最低の精度を得ることができます(毎秒更新、低解像度の経路探索、本質的ではないNPCからNPCへの相互作用を排除します)。

より大きく、より複雑なゲームでも、同様のアプローチを使用できます(および使用しました)。彼らは、移動計算が必要なときにパスを見つけるのではなく、戦闘計算を単純化したり、キャラクターをテレポートしたりするかもしれません。

ゲームが十分に大きく、すべてを常にメモリ内に保持できない場合、適切な解決策は、最後に更新した時間を部屋の保存データに保存し、シミュレーションを画面外(最低解像度)で再生することですバックアップされてロードされます。

AIがスケジュールに従ってアンロードされた「スリープ」エリアから「ライブ」エリアに移動すると予想される場合は、それらのリージョンの超低忠実度データを作成して、常にメモリを保持する必要があります(たとえば、最も粗いnavmeshの詳細レベルとキーオブジェクト/キャラクターの位置)またはこれらの領域を定期的に循環させます(たとえば、メモリ内のX「スリープ」領域を維持し、頻繁に更新せずに忠実度の低いシミュレーションを実行し、主要なアクティブNPCが含まれる「スリープ」エリア、必要に応じてアンロードおよびロードエリア)。


1

その部屋インスタンスの現在の部屋にあるエンティティを保存します。部屋オブジェクトは、どのエンティティを更新する必要があるかを追跡します(たとえば、別の部屋に移動したり、その部屋の何かを変更したりします)。また、毎秒1つ(またはそれ以上)の部屋を更新します(別のスレッドで)。

ルームを更新すると、NPCの位置が更新され、最後の更新以降にルームとやり取りするすべてのアクションが実行され、最後に必要な更新の時刻がチェック/更新されます。

エンティティがある部屋から別の部屋に移動する場合、インスタンスは別の部屋に保存され、エンティティの次の更新も更新される必要があります。

この方法では、現在の部屋とその時点で更新が予定されている部屋のみを更新し続ける必要があり、他の部屋の更新はオプションです(ただし、プレイヤーが移動するか何かを行うたびに更新するAIがある場合はお勧めします) 。

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