リアルタイム3Dゲーム用のC++プラグインを作成しようとしています。UDPの理論、その仕組み、長所と短所は何かをしっかりと把握していると思いますが、私の主な関心事は、パフォーマンス、スケーラビリティ、および可能性のある統計です。私はおそらく、UDP、さらにはTCPに関しては、価値のある海の低下についてしか知らないことを知っています。
質問:
特定のシナリオを考えると、一般的な専用サーバーが一度に対処できるプレーヤーの数。
今シナリオのために...
すべてのプレイヤーが「ゲームの世界」のどこにでもいることができるMMORPGゲームがあると想像してみてください。誰もが同じサーバー/サーバーハブにデータを送受信します。これは、誰もが最終的にパスが交差するときに、他のすべての人を見て対話できる必要があるためです。これはリアルタイムの一人称ゲームであるため、プレーヤーの位置は非常にタイムリーに最新である必要があります。
オンラインに1000人(または10000人)のプレーヤーがいるとしましょう...
ここでは、次の3つの主要なことが発生する必要があります。
各プレーヤーは、UDPを介してデータをゲームサーバーにストリーミングします。たとえば、1秒あたり14回の送信です。一言で言えば、このデータには、各プレーヤーが誰で、どこで、何であるかが含まれます。送信されるデータは、帯域幅の使用を最小限に抑えるために、サイズと速度が正規化および最適化されています。
サーバーは、たとえば、これらのパケットを1秒間に最大1000個(架空の数字ではない)受信するため、1秒あたり14,000個のパケットを処理します。この処理フェーズには通常、中央メモリデータ構造の更新が含まれます。この場合、プレーヤーの古いx、y、z位置データは、新しい位置とタイムスタンプで更新されます。サーバー上のこのデータ構造には、ゲームの世界全体のすべてのプレーヤーのすべてのデータが含まれています。
サーバー(場合によっては別のスレッド、場合によっては別のマシン)は、パケットを他のすべてのプレーヤーにブロードキャストする必要があります。これにより、サーバーは画面を更新して、マップ上に他のプレーヤーを表示できます。これも1秒間に14回発生します。(14は通常動的な数値であり、使用されているCPU容量、ビジー状態のCPU、フレームレートの低下、またはその逆に基づいて変化します)。
重要なことはこれです:プレーヤーXの場合、彼の位置の視覚範囲内の他のプレーヤーのデータのみがそのそれぞれのプレーヤーにディスパッチされます。したがって、プレーヤーYが2マイル離れている場合、彼のデータはXに送信される必要がありますが、プレーヤーZが惑星の反対側にいる場合、帯域幅を節約するために彼のデータはXにディスパッチされません。もちろん、これには、可能な限り最も効果的なインデックス作成ソリューションを使用してデータを繰り返しフィルタリングする必要があるため、もう少し処理が必要になります。
私の懸念はこれです。クライアントマシンからデータパケットを送信し、サーバーのRAMに入れ、データを更新するためのわずかな処理を実行し、他のプレーヤーに情報を選択的にブロードキャストするには時間がかかります。これは、サーバーが処理できる特定のしきい値があることを意味します。もちろん、実装の有効性、使用されているハードウェアの速度と能力、そしてもちろん、インターネット速度などの他の外部要因によって異なります。 、トラフィックおよびnr。毎秒地球に当たる太陽フレアの数...冗談です。
私は、このプロセスを経験した他の人たちから、落とし穴とは何か、そしてマルチプレイヤープラグインを作成するときに期待できる典型的なパフォーマンスを見つけようとしています。
「同じサーバーで同時にプレイする10000人に対応したい」と簡単に言うことができ、「サーバーごとに100がより現実的でありそうな数字です」と言うかもしれません。
そのため、何千ものリクエストとディスパッチを処理し、処理負荷を複数のマシンに分散するために、複数のサーバー/クラウドコンピューティングハブを考え出す必要があるかもしれないことを認識しています。したがって、データの受信のみを処理するマシンがいくつかあるかもしれません。巨大な中央ボックスは、すべての受信マシンとディスパッチマシン、そしてもちろん一連のディスパッチマシンによって何らかの形で共有されるインメモリデータベースのようなものです。
明らかに、技術的な限界があり、私はそれらが何を期待し、何であるかを本当に知りません。また、問題に追加のCPUとサーバーボックスを投入しても、必ずしも問題が解決するわけではありません。マシン間の相互通信が増えると、プロセスが少し遅くなるためです。より多くのCPUを投入すると、効果が低下し、あるしきい値でCPUの生産性が低下する可能性があると思います。
マルチプレイヤー用のP2P(Peer To Peer)を検討できますか?
一度に2500人のプレイヤーに対応できると言っているのは現実的ですか?
数年以内に10000人のプレイヤーにスケールアップすることは可能でしょうか?
この質問は非常に長いことを知っていますので、心からお詫び申し上げます。