1

Java マルチプレーヤー ターンベース ゲームを作成しています。各プレーヤーが移動する時間を制限したいと考えています。ゲームはゲーム セッションまたは部屋で構成され、各部屋には 4 人のプレーヤーがいます。ゲームには約 40 のゲーム セッションがあり、各セッションには最低 160 ターンがあります。

最初に を調べた後、より優れていると思われるjava.util.Timerを見つけました。各ゲーム セッションを作成し、ターンごとに新しいランナブルを作成し、ランナブルが実行される前にプレーヤーが移動した場合は、メソッドを呼び出すことができます。ScheduledExecutorServiceSingleThreadScheduledExecutorScheduledFuture.cancel()

理論的には問題ないようですが、いくつか懸念があるので、次のことを知りたいです。

  • これは正しいアプローチですか?またはより良い代替手段がありますか?

  • ゲーム セッションごとScheduledThreadPoolに 1 つではなく、すべてのゲーム セッションに 1 つだけを使用できますか?SingleThreadScheduledExecutor

  • ScheduledFutureキャンセルすると、実行時までメモリに保持されることに気付きましたが、これはメモリ使用量の問題でしょうか?

  • 最後に、ターンごとに新しいランナブルを作成する代わりに、同じランナブル (ゲーム セッションごとに 1 つ) を再利用することは可能ですか。

4

1 に答える 1

0

AScheduledExecutorServiceは、開始するのに最適な場所です。ゲームの状態へのアクセスを適切に同期することを忘れないでください。

通常、ランナブルをリサイクルすることは合法ですが、おそらくここでは最良の選択肢ではありません。

ターン数が膨大にならない限り、タスクをキャンセルするためのオーバーヘッドは価値がありません。代わりに、実行可能な情報に、どのゲームのどのターンが計時されているかを含めます。タスクが実行されたら、ゲームの状態をチェックして、それがまだ現在のターンであるかどうかを確認し、ターン カウントが既に進んでいる場合は何もしません。

cancel()これにより、締め切り間際に移動が送信された場合に発生するような、タスクの完了と実行の間の競合状態が回避されます。

于 2013-05-17T11:20:09.077 に答える