3

ラウンドで動作するターン ベースのマルチプレイヤー ゲームを作成しています。基本的に、プレイヤーが試合を主催し、別の人がそれに参加して、ゲームが始まります。サーバーはこれらの一致を処理し、5 秒ごとにクライアントに更新を提供する必要があります。私は通常、これを timer/a thread.sleep() で行います。私の問題は、複数の試合で同時にこれを行う方法がわからないことです。試合ごとにスレッドを使用するのは、何もしていないよりもアイドル状態になっているため、ばかげているように感じます。

私の 1 つのアイデアは、すべての試合を 5 秒間隔で更新するスレッドを 1 つだけ持つことです。これに関して私が感じる唯一の問題は、多くの試合が一度に行われると、最後に更新されたゲームがかなりの遅延を得る可能性があることです. (私のゲームは時間ベースなので、これがどれほど重要かはわかりませんが、原始的なようです)。

私の他のオプションは、有望と思われる ScheduledExecutorService (スレッドプール) を使用することでした。

  1. ソケット接続用のスレッド プールも実行しているため、ScheduledExecutorService スレッド プールで問題が発生することはありますか?

    2.私が達成しようとしていることを達成するためのより良い方法はありますか?

明確にするために、基本的に試合ごとに5秒ごとに関数を呼び出す方法を探しています。例えば:

私のゲームは 0 秒から始まり、あなたのゲームは 2 秒から始まります。サーバーは update 関数を呼び出します。

私の場合: 0、5、10、15、20、25 など.​​..

あなたのために: 2,7,12,17,22,27,etc...

4

1 に答える 1

0

「私の考えは、すべての試合を 5 秒間隔で更新するスレッドを 1 つだけにすることです。」毎秒更新スクリプトを実行する方が良いでしょうが、更新は ID mod 5 == 0 に一致します。これにより、HOT 秒の悪影響を減らすことができます。

また、thread.sleep() は良くなく、厳密な時間を保証するものではありません。thread.sleep(5000) — 少なくとも 5 秒間スリープすることを意味します (ただし、悪い場合は 10 秒になり、それ以上になることもあります)

Java Timerhttp://www.javacodegeeks.com/2012/07/quartz-2-scheduler-example.htmlを見てください。

TimerTask を使用すると良い判断になると思います。

ゲーム用の Java タイマーも参照してください。

UPDate: 「トピック」通知については、https ://netty.io を参照してください。(良い例では、10 - 160 k の接続が実際の商用プロジェクトで実際に使用されます)

于 2013-01-17T01:53:16.213 に答える