1

ゲームをリストする「ロビー」システムを維持するオンラインゲームについて、好奇心から少し読んでいます。
各クライアントを現在のゲーム リストの状態とどのように同期させているのでしょうか?

私は「クライアントがゲームリストの更新を要求する」という用語で話していますが、イベント駆動型の用語ではありません (ゲームの状態が変化し、すぐにそれをブロードキャストします <--- スケーラブルではありません!)。

考えられるシナリオ:
サーバーは、オンライン プレーヤーへの接続を 5000 保持しています。
1000 ゲームのリストがあります。
クライアントは、1 秒ごとにゲーム リストの更新を要求します。
ここで、サーバーはすべてのゲーム リストを繰り返し処理し、特定の各ゲームの最終更新時刻を比較する必要があります。その後、プレーヤーの最終更新が古いことがわかった場合は、更新を送信します。
これは、1 秒ごとに (5000 * 1000 = 5,000,000 )の反復があることを意味します。

それを回避する実用的な方法はありますか?
あなたはすでにそれを行っていますか?私とヒントを共有できますか?

キャッシュを持つことを考えていました。あなたの解決策は何ですか?

4

2 に答える 2

2

まず、1 秒間に 500 万回の比較を行っても、最新のハードウェアに大きな負担をかけることはありません。1 GHz の CPU で比較に 10 サイクルかかるとします。これにより、CPU 負荷がわずか 5% になります。もちろん、それを簡単に最適化することはできますが、もっと重要なことがあるのではないでしょうか?

より可能性の高いボトルネックは、ネットワーク帯域幅です。各クライアントに毎秒約 1000 ゲームのデータを転送する必要がありますか? ゲームごとに 100 バイトのデータがあるとします。これは、プレーヤーごとに約 1MBit の帯域幅に相当します。

幸いなことに、クライアントはすべてのゲームについて知る必要はありません。典型的なパターンは、ユーザーが希望するゲームを (たとえばゲームの種類ごとに) 述べ、クライアントがこのフィルターをサーバーに送信し、サーバーが一致するゲームのみを送信するというものです。

于 2010-06-05T01:05:11.070 に答える
1

順序を逆にすることもできます。ゲームリストが変更されるたびに、すべてのクライアントに更新を送信します。

帯域幅を節約したい場合は、最後に送信された更新とは異なる情報のみを含む小さな更新パケットを作成し、intゲームの ID を使用する必要があります。これは簡単です。

すべてのクライアントを同じロビー ステータスに同期させておきます。これは、これを行う必要があるためです.. 共通のリストを公開するときに、なぜ異なるタイミングを気にする必要があるのでしょうか?

于 2010-06-05T01:03:36.310 に答える