3

私は、プレイヤーが JVM 上で互いに競合する AI エージェントを作成するゲームを作成しています。現在、アーキテクチャは次のようになっています。

  1. 物理シミュレーションを処理し、プレイヤーからのメッセージを入力として受け取って世界を変更するコア サーバー モジュール。コアはまた、さまざまなルール (戦争の霧を考えてください) に基づいて、各プレイヤーの視点から世界がどのように見えるかを決定します。
  2. プレーヤー モジュールは、ワールドの更新されたバージョンをコアから受け取り、それらを処理し、その処理に基づいてメッセージを入力としてコアにストリーミングします。

コアは 2 つのプレーヤー モジュールと共にコンパイルされ、次にシミュレーションが実行され、再生して試合の視覚化を生成できる出力ストリームが生成されます。

私の質問は、各プレーヤーが 1 つの Java スレッドで実行される場合、2 つのプレーヤー スレッドが同じ量のリソース (主に CPU 時間だと思います) を取得することを保証することは可能ですか? 私は各 AI が行っている処理の性質を制御していないため、プレイヤーの 1 人が非常に非効率的である可能性がありますが、そのスレッドが非常に多くのリソースを消費するように書かれている可能性があります。公平に競争しない。

これは、ハード リアルタイム OS なしでは不可能であると感じています。JVM はそれに近いものではありません。

4

3 に答える 3

3

「プレーヤーモジュールは、コアからワールドの更新されたバージョンを受け取り、それらを処理し、その処理に基づいた入力としてメッセージをコアにストリーミングします」. これは、プレーヤー モジュールの内部に更新メッセージを受信し、結果メッセージをコアに送信するループがあることを意味します。次に、軽量のアクター モデルを使用します。各プレーヤーはアクターであり、すべてのアクターは同じ ExecutorService を使用します。アクティブ化されたアクターは同じエグゼキューター タスク キューを通過するため、CPU へのアクセスはほぼ同じです。

于 2013-01-15T07:04:52.743 に答える
1

これはJavaでは実際には不可能だというあなたの直感は正しいです。リアルタイム OS を使用していたとしても、リソースを大量に消費する AI スレッドを作成することはできます。

少なくともここで役立ついくつかのアプローチがあります。まず、2 つのプレーヤー モジュール スレッドに同じ優先度を指定してください。2 つ以上のプロセッサを搭載したマシンで実行していて、各プレーヤー モジュール スレッドの優先度を最高に設定している場合、理論的には、何かを行う必要があるときはいつでも実行する必要があります。しかし、プレーヤー モジュール自体が新しいスレッドを生成するのを止めるものがない場合、プレーヤーがそれをしないという保証はできません。

したがって、短い答えはノーです。Javaでこれらの保証を行うことはできません。

シミュレーションの仕組みによっては、「ターン」の概念を持つことができるかもしれません。したがって、シミュレーションはプレーヤー 1 に移動するように指示し、次にプレーヤー 2 に移動を指示し、前後に移動するため、一度に 1 つの「移動」のみを行うことができます。ただし、これがあなたの状況で機能するかどうかはわかりません。

于 2013-01-15T04:56:21.997 に答える
0

スレッドが実行しなければならない作業量 (またはスレッドの優先順位を設定するだけ) に関して調整するノブがある場合は、 を使用して定期的にスレッドを監視し、 を使用してスレッドThreadMXBeanの CPU 使用率を見つける別のスレッドを設定できますThreadInfo.getThreadCpuTime。その後、各プレイヤーの CPU 時間を比較し、それに応じて対応できます。
これがタイムリーで正確かどうかはわかりませんが、時間の経過とともに CPU 使用率のバランスを取ることができます。
ただし、作業をパケットに分割し、以前に提案されたようにエグゼキュータを使用する方が、より良い方法であり、より Java に似ているはずです。

于 2013-01-15T11:40:54.100 に答える