ロビーサーバーの記述には何が関係していますか?


8

ゲームルーム、一般的なチャットなどのロビービューに基づいてチェスのマッチメイキングシステムを書いています。これまでのところ、プロトタイプは機能していますが、サーバーで行ったいくつかのことには大きな疑問があります。ゲームロビーサーバーを書くことは私にとって新しいプログラミングエクスペリエンスであり、そのための明確で正確なプログラミングモデルはありません。また、それがどのように機能するかを説明した論文も見つかりませんでした。アマゾンから「Javaネットワークプログラミング3版」を注文しましたが、まだ出荷を待っていましたが、この本で役立つ例や情報が見つかると思います。

その間、私はあなたの意見を集めて、サーバーを正しく書く方法を学ぶことができるようにいくつかのことをどのように処理するかを見たいと思います。ここに私の頭の上のいくつかの質問があります:(もっと来るかもしれません)

最初に、サーバーの動作を定義しましょう。主な機能は、クライアントとのTCP接続を保持し、クライアントが生成したイベントをリッスンして、他のプレーヤーにディスパッチすることです。しかし、それだけではありませんか?

クライアントごとに1つのスレッドを使用する必要がありますか?その場合、300クライアント= 300スレッド。それは多すぎませんか?それをサポートするにはどのようなハードウェアが必要ですか?そして、ロビーはおよそどのくらいの帯域幅を消費しますか?

クライアントのソケットを保持するためにどのようなデータ構造を使用する必要がありますか?スループットを損なうことなくイベントをディスパッチするために繰り返し処理するときに、同時変更(たとえば、プレーヤーがロビーに入る、またはロビーに存在する)からそれをどのように保護しますか?ここでConcurrentHashMapが正しい答えですか、それとも私が知っておくべきいくつかのテクニックがありますか?

ユーザーがロビーに入るとき、ロビーの状態をユーザーに転送するためにどのようなメカニズムを使用しますか?そして、これが起こっている間、他のイベントはどこで泡立ちますか?


最近のOSでは300スレッドで問題ありません。1000を超えると、接続されていないシステムなど、他のシステムをチェックアウトしたい場合があります。
Valmond、2011年

回答:


3

すべてをオブジェクトとしてモデル化します。チャットルーム、ゲームセッション、プレーヤーのクラスがあります...新しいプレーヤーのために新しいスレッドを生成しないでください。代わりに、すべてのクラスを状態マシンとして表示してみてください。プレーヤーは接続または切断でき、TcpConnectionと、移動するまでの残り時間を指定する変数を持っています(例として)。

次に、すべてのオブジェクトを配列またはそのようなものにした場合、10ミリ秒ごとに反復し(数値は当然の例です)、適切なアクションを実行します。

たとえば、プレーヤーの1人がゲームを離れた場合、ゲームセッションを終了し、1人のプレーヤーから別のプレーヤーに移動を送信します...

ゲーム内で発生するすべてのイベントについて、ネットワークを介してメッセージを送信する必要があります。異なるメッセージタイプを保持する1つの追加クラス/列挙を作成します。1人のプレーヤーが移動した場合、これをサーバーに「d4からd5に移動」または何かに送信できます。チェスゲームだけを作成する場合は、ネットワークを介して文字列を送信できます。より複雑なものについては、1バイトのみを送信することをお勧めします。

通常、ゲームパケットは、パケットの長さ、パケットメッセージタイプ/イベントタイプ(移動、プレーヤー参加、プレーヤー左など)とコンテンツ(プレーヤーが参加する場合、コンテンツは例)


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