3

現在、最大 32 人のプレイヤーが同時に接続できる XNA ゲーム用の専用サーバーを C# で設計することを計画しています。私は System.Net を使ったネットワーキングの経験はありますが、これまで非常に多くのプレイヤー数に対処する必要はありませんでした。

スレッド (特に各プレイヤーに 1 つ) を作成および破棄することは良い考えではないことを心から知っています。また、「スレッドが利用できない場合に順番に待機する」ため、ThreadPool を使用するかどうかはわかりません。自然。そこで、大量のクライアント数を処理するために Async を使用することにしました (最後の選択肢とほぼ同じです)。

しかし、これが賢明な選択なのか、それとも厳しいニーズに合わせて他のものを使用すべきなのかはまだわかりません.

この質問が暗いように聞こえる場合は申し訳ありませんが、私はかなり困惑しています - 助けていただければ幸いです!

4

3 に答える 3

3

ゲームの制限が実際に32人の同時ユーザーであり、おそらく少数のオブザーバーである場合、特にコールバックよりもコーディングが簡単であることがわかっている場合は、スレッドは問題ありません。(共有データ構造へのアクセスを適切に調整する必要があり、これの複雑さは、対応するイベントベースの設計を上回る場合があります。)

たぶん、32人の同時ユーザーのためのスレッドプールでさえ気にしないでしょう。

スループットに対するスレッドの制限は、約100スレッドを示しています(もちろん、実装の詳細によって異なります)。100人の同時ユーザー(たとえば、かなり負荷の軽いIRCサーバー)を目指すことがない場合は、あなたとあなたのチームがイベントモデルに慣れていない限り、非同期イベントモデルは必要ありません。

于 2012-01-21T01:27:01.533 に答える
2

サーバーが I/O バウンドの場合、非同期アプローチは強力です。I/O の待機中に必要なリソースが少なくなります。

サーバーが CPU バウンドの場合、スレッド アプローチは強力です。複数のコアまたは CPU に簡単に拡張できます。

ユーザー数が 32 の場合、少なくとも .NET で非同期サポートの準備が整うまでは、慎重にスレッドを使用することをお勧めします。すべてのスレッド間通信に .NET に含まれるスレッド セーフな構造を使用するだけで、独自のコードを作成しないでください。問題はありません。独自のコードを作成することにした場合、経験から言うと、わずかな間違いでも追跡が非常に困難なランダムエラーが発生する可能性があるため、おそらく不利になるでしょう。

于 2012-01-21T01:37:30.813 に答える
0

何が適しているかは、計画している負荷によって異なります。最もパフォーマンスの高いソリューションは通常、非同期プロセッサのスレッド プールであると考えられていますが、これは簡単にやり過ぎになる可能性があります。ジョブを実行できる最も単純なソリューションを選択してください。

于 2012-01-21T01:24:45.547 に答える