RTSゲームAIスレッド


14

リアルタイム戦略ゲームをゼロから作成するプロジェクトがあります。私はまだ計画の初期段階にありますが、機構を見るために少しプログラミングをしています。

プログラミングの方法を知っています。また、コンピュータープレーヤーのゲームクラスとルールベース(ステートマシン)AIをどのように構成するかについても良い考えがあります。

特定のユニットに特定の動作を与える(しかし、スカウト、ミッションルートに従う、ポジションを保持する(接近する敵を攻撃する、または圧倒された場合は退却する)など)Doctrineを開発したいなど

教義はユニットにのみ適用されるため、ユニットの観点があり、マップ全体の状況については認識されません。

コンピューターAIは、表示されているマップ全体を分析し、別のルールセットに応じて各ユニットを割り当てるソクトリンを決定します。

OpenGLを使用してC#でこれを行っています。

今のところ、私は主な構想を始める前に、テストには多くのことはなく、ほんの少ししかありません。すべてのゲーム処理(更新、戦闘、戦闘などを次々に呼び出す)が発生するゲームループがあり、Application.Idleイベントの場合は非常に頻繁に呼び出されます。

今、私は疑問に思っていました。ゲームループでは多くの処理が必要になるため、コンピューターAIとユニットはそのループでアクションを選択する必要がありますか、それとも遅すぎますか?

すべてを同時に実行したい場合、コンピューターAI用に別のスレッドを作成する必要がありますか?それとも、ユニットごとに個別のスレッドですか?

マルチスレッドの経験はあまりありません。これに最適なアプローチは何でしょうか?


無関係-OpenGLではなくOgre3Dと見なされますか?

実際、いや、私はそれを聞いたことがありません。OpenGLを使用しているのは、それがクラスで教えられたからです。Ogre3Dも2Dを実行できますか?私はそれができると思いますが、私たちは決して知りません

はい、できます。独自のGUIツールキット(cegui)もあります。たとえば、TorchLightはそれで構築されます。OpenGLの周りをうまくラップするため、時間を節約できます。 ogre3d.org/tikiwiki/MOGRE

「またはユニットごとに個別のスレッドでさえ」地獄はありません。スレッドのオーバーヘッドは大きすぎます。1つには、スレッドのスタック用の予約メモリがあります(デフォルトでは1MB)。また、スレッドスイッチも高価です。

回答:


3

「ゼロから」とはどういう意味ですか?DirectXの代わりにXNAなどを使用できますか?

流動的な動きを得るには、毎秒30〜60フレームの範囲でレンダリングする必要があります。fpsを増やす必要はありません。

レンダリング+ロジックの所要時間が60 fpsで得られる16ミリ秒未満の場合、AIスレッドは必要ありません。

フレームのレンダリングの間に十分な時間がない場合は、フレームごとに更新する必要があるものとそうでないものについて、本当に慎重に考える必要あります。

「ドクトリン」の部分は、少なくとも表示されているユニットや近くにある他のユニットについて、すべてのフレームで更新できるように、できるだけシンプルで効率的である必要があると思います。表示されているユニットに直接影響を与えないユニットは、より少ない頻度で更新できます(それに応じて、デルタTも大きくなります)。

メインAIは、マップ上のすべてのユニットを処理し、戦略を把握する必要があるため、実行する作業が多くなります。そのため、ほとんどの計算時間が必要になります。これは、別個のスレッドの最初の候補です。

分隊レベルAIのように、2つの間に別のレイヤーを追加したい場合があることに注意してください。基本的に、各ユニットのAIは、ユニットが当面の状況に「インテリジェントに」応答することを確認する必要があるため、高速で応答性が高い必要があります。分隊のAIは、分隊が川を渡る必要がある場合に橋を見つけるなど、数秒間に広がる複数のユニットの「インテリジェント」アクションを担当します。そして、メインAIは、長期間にわたって多くのチームの行動を指示する必要があります。

特に、経験があまりない場合は、スレッド化を行う必要はありません。これは追加の負担がないため複雑です。マルチスレッドは、別のプロジェクトとして、またはこのプロジェクトが動作状態になったら拡張として学習できます。幸運を!


0

AI用に個別のスレッドを用意します。ただし、すべてのユニットではなく、OSリソースを大量に消費し、同期は悪夢になります。

AIスレッドが実行の機会を見つけることを確認してください。軽視しないでください。メインスレッドがあまりにも多くのことを行う場合、その機会を見つけられない可能性があります。AIスレッドに単に高い優先度を与えると、ゲームは応答しなくなり、受け入れられなくなります。

そのため、メインループで同期ポイントやイベントを慎重に選択し、メインスレッドが停止している間にAIスレッドが計算を完了するようにします。たとえば、ユーザーユニットに別のAIユニットが表示される場合は、同期して、更新されたユニットがその逆に表示されるようにします。


0

私はまた、RTSゲームにゼロから取り組んでいます。まだテストしていませんが、プレイヤーに現在表示されているすべてのユニット(プレイヤーが実際に見る画面の部分または画面の境界付近)のメインゲームループでユニットAIを実行することを考えました)、プレーヤーが画面を少し動かす可能性が高いためです。

他のユニットは別のスレッドでチェックされ、私には2つの優先順位があります。2.隠されたエリアにあるユニット(まだ探索されておらず、「戦争の霧」)。

秒単位の優先度のユニットについては、ループの実行頻度を減らし、必要に応じて遡って移動することで補正します。


1
非常に複雑に聞こえます。

あなたのアイデアは、ユニットをメインゲームループに出し入れすることに関する最初の部分を除いて、うまく聞こえます。すべてのAIは独自のループで実行する必要がありますx。この場合、優先度の低いユニットでの反復ごとにループをスキップすることを選択できます。
オルホフスキー

0

マルチスレッドが必要かどうかに関係なく、AIをマルチスレッド化する準備をすることをお勧めします。

メインスレッドは、世界を更新し、物理学などにチェックを入れ、AIの世界観を表すデータ構造(ユニットの位置、リソースの状態など)を設定します。このデータ構造は、メインシステムをキャッシュします。単にそれらへのポインタを保持するよりも。これは、同期ポイントと呼ばれることもあります。

このデータ構造をAIに渡し、この構造の内容について推論することのみを許可します。AIにさらに情報が必要な場合は、構造に追加してください。AI用語では、これはしばしば黒板と呼ばれますが、キャッシュとも呼ばれます。AIにキャッシュへの書き込みを許可しないでください。出力は別個のデータ構造を介して行われます。

AIは他のゲームシステムに直接依存しないため、このセットアップによりゲームを並列化できます。これらのシステムはスレッドセーフである必要はなく、ロックを取得しないでください。AIが回転している間、レンダラーなどを安全に実行できます。

副次的な利点として、将来、他のシステムから取得した情報を徐々に減衰させて、正確な知識ではなく不確実性をシミュレートすることにより、キャッシュを拡張できます。

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