0

非同期ソケットと非同期パケット ハンドラーを実行する MMORPG サーバー用の 1 つのスレッドがあり、その 1 つのスレッドに、ゲーム内のすべてのエンティティを含む静的ワールドがあるとします。

たとえば、非同期パケット ハンドラーが攻撃メッセージを受信すると、スレッドの問題が発生し、ターゲットを特定するために世界中のエンティティが検索されます。

同時に、静的 World Proc メソッドは、モンスター エンティティを含む Dictionary のサイズを増やし、生成されたモンスターを追加します。

これがすべて同じスレッド上にある場合、サーバーは爆発しますか?

4

3 に答える 3

2

サーバーが爆発する?

はい、非同期のものは別のスレッドで実行されており (そのスレッドを明示的に作成していなくても)、共有オブジェクト (世界) に同時にアクセスする可能性があるため、問題 (「爆発」) に遭遇する可能性があります。メインスレッド。多くのデータ構造 (ディクショナリを含む) は、このシナリオ用に設計されていないため、クラッシュしたり、間違った答えを返したりする可能性があります。

典型的なアプローチは、ロックを使用して共有オブジェクトを保護することです。変更する前にロックを取得し、任意の変更を行ってからロックを解放します。このように、一度に 1 つのスレッドだけが世界 (およびその辞書) にアクセスするため、すべての一貫性が保たれます。爆発は回避されました。

もう 1 つの方法は、ネットワークのより同期的な形式に切り替えることです。たとえば、完了ハンドラーを回避し、代わりに各プレイヤーからの連絡を待ってから、入力に基づいて処理するなどです。これは非常に簡単に行うことができますが、単純な方法には欠点があります。遅いプレイヤーが 1 人でもいると、全体が遅くなる可能性があります。悲しいことに、何らかの方法で何らかの複雑さに対処しなければならない可能性があります。

于 2013-02-22T03:01:57.290 に答える
0

同じスレッドにある場合は、いいえ。言及されているすべての作業を単一のスレッドで実行している場合、問題はありません。ただし、前述のように、スレッド間で「共有」オブジェクト インスタンスにアクセスしている場合は、問題が発生し、ロックが必要になります (「lock(){...}」ブロックを使用)。

ユーザー ベースが増加するにつれて、生成されたスレッドの数、または着信要求に非ブロッキング イベント モデルを使用している場合はイベント メッセージに注意する必要があります。

別の、まだ関連する注意事項として、この C# ベースの MMO サーバー (スクリプトのサポートあり) に注目してください: https://dreamspace.codeplex.com/ - すぐに MMO ゲームの作成者にとって大きな助けになるかもしれません (Construct をサポートする予定です) 。デフォルトでは 2)。

于 2013-03-27T04:32:29.440 に答える
0

一行で答えるなら。サーバーが爆発します。ネットワーク アクティビティとゲーム ロジックは同じスレッドにあるため。そして、あなたが言及したように、ネットワークの使用率が高くなる必要があります.

あなたがF#を見ているなら、私はそれが本当に好きです。必要なものがすべて揃っています。私が質問から得た限りでは。また、コレクションの変更のようなものはほとんどなく、言語ではデフォルトで非同期になっています。Nodejsも試してみる価値があります。しかし、それはすべて要件に依存します。決定を下すのに役立ついくつかのキーワードを説明しようとしていますが.

ノンブロッキング : スレッドがイベントでブロックされないことを意味します。関数が別の関数の実行を待機するのを待機しません。しかし、それはあなたがそれをブロックできないという意味ではありません。いずれにしてもシングルスレッドです。

非同期:それはそのようなものです。しかし、C# 5 では async にキーワードが付属しているため、プログラミングのスレッド部分を実行する必要はありません。

並列処理: ゲーム開発では並列処理が重要です。これで、複数のスレッドを使用するか、単にTPLを使用できます。

UI ベースの (多くのオブジェクトがある) ゲームの場合、ユーザー エクスペリエンスを向上させるために、処理スレッドと UI スレッドを分離することを強くお勧めします。そうしないと、データの処理中に FPS が低下します。

さらに情報が必要な場合はお知らせください。

少し気をつけないとサーバーが落ちません。

于 2013-02-22T02:33:07.063 に答える