マルチプレーヤー オンライン ゲームで。変数をグローバルに保つには? 私たちはオンライン ゲームを開発しており、グローバル変数が必要です。1 つのサーバーと複数のクライアントが存在します。同期しているすべてのクライアントが静的で編集可能な共通変数を保持するにはどうすればよいでしょうか。何か提案はありますか?
3 に答える
クラスターに移動した場合、ヒープベースの変数は十分にグローバルではないため問題になります (各ノードには個別のコピーがあります)。
これが問題ではなく、「変数」が String や Long のような単純なものを意味する場合、最良のオプションはjava.util.concurrent.Atomic*
クラスを使用することです。例えば、
public static final AtomicLong id = new AtomicLong();
これの最も重要な利点は、比較と交換と取得と設定を使用してアトミックに更新できることです。たとえば、id.getAndIncrement();
- public static final
Java でグローバル変数を作成するために使用されます。
-ただし、操作がメモリに対して直接行われ、メモリから直接読み取られるvolatile
ように、これを使用する必要があります。
-のクラスを使用する方がよいでしょう java.util.concurrent.Atomic
。
-AtomicInteger
、、などAtomicLong
を使用できますAtomicReference
....
サーバーは変数を制御する必要があります。
クライアントがその変数に変更を加えたい場合、クライアントはそれを変更せず、新しい必要な値を伝えるメッセージをサーバーに送信する必要があります。サーバーはそれを保存し、すべてのクライアントにメッセージをブロードキャストします。その後、すべてのクライアントがその変数を新しい値で更新します。
もちろん、サーバーが自分で変更した場合は、新しい値をブロードキャストするだけです。