問題タブ [multiplayer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
3023 参照

networking - マルチプレイヤーUDPネットワーキング戦略、アドバイスが必要

リアルタイム3Dゲーム用のC++プラグインを作成しようとしています。UDPの理論、その仕組み、長所と短所は何かをしっかりと把握していると思いますが、私の主な関心事は、パフォーマンス、スケーラビリティ、および可能性のある統計です。私はおそらく、UDP、さらにはTCPに関しては、価値のある海の低下についてしか知らないことを知っています。

質問:

特定のシナリオを考えると、一般的な専用サーバーが一度に対処できるプレーヤーの数。

今シナリオのために...

すべてのプレイヤーが「ゲームの世界」のどこにでもいることができるMMORPGゲームがあると想像してみてください。誰もが同じサーバー/サーバーハブにデータを送受信します。これは、誰もが最終的にパスが交差するときに、他のすべての人を見て対話できる必要があるためです。これはリアルタイムの一人称ゲームであるため、プレーヤーの位置は非常にタイムリーに最新である必要があります。

オンラインに1000人(または10000人)のプレーヤーがいるとしましょう...

ここでは、次の3つの主要なことが発生する必要があります。

  1. 各プレーヤーは、UDPを介してデータをゲームサーバーにストリーミングします。たとえば、1秒あたり14回の送信です。一言で言えば、このデータには、各プレーヤーが誰で、どこで、何であるかが含まれます。送信されるデータは、帯域幅の使用を最小限に抑えるために、サイズと速度が正規化および最適化されています。

  2. サーバーは、たとえば、これらのパケットを1秒間に最大1000個(架空の数字ではない)受信するため、1秒あたり14,000個のパケットを処理します。この処理フェーズには通常、中央メモリデータ構造の更新が含まれます。この場合、プレーヤーの古いx、y、z位置データは、新しい位置とタイムスタンプで更新されます。サーバー上のこのデータ構造には、ゲームの世界全体のすべてのプレーヤーのすべてのデータが含まれています。

  3. サーバー(場合によっては別のスレッド、場合によっては別のマシン)は、パケットを他のすべてのプレーヤーにブロードキャストする必要があります。これにより、サーバーは画面を更新して、マップ上に他のプレーヤーを表示できます。これも1秒間に14回発生します。(14は通常動的な数値であり、使用されているCPU容量、ビジー状態のCPU、フレームレートの低下、またはその逆に基づいて変化します)。

重要なことはこれです:プレーヤーXの場合、彼の位置の視覚範囲内の他のプレーヤーのデータのみがそのそれぞれのプレーヤーにディスパッチされます。したがって、プレーヤーYが2マイル離れている場合、彼のデータはXに送信される必要がありますが、プレーヤーZが惑星の反対側にいる場合、帯域幅を節約するために彼のデータはXにディスパッチされません。もちろん、これには、可能な限り最も効果的なインデックス作成ソリューションを使用してデータを繰り返しフィルタリングする必要があるため、もう少し処理が必要になります。

私の懸念はこれです。クライアントマシンからデータパケットを送信し、サーバーのRAMに入れ、データを更新するためのわずかな処理を実行し、他のプレーヤーに情報を選択的にブロードキャストするには時間がかかります。これは、サーバーが処理できる特定のしきい値があることを意味します。もちろん、実装の有効性、使用されているハードウェアの速度と能力、そしてもちろん、インターネット速度などの他の外部要因によって異なります。 、トラフィックおよびnr。毎秒地球に当たる太陽フレアの数...冗談です。

私は、このプロセスを経験した他の人たちから、落とし穴とは何か、そしてマルチプレイヤープラグインを作成するときに期待できる典型的なパフォーマンスを見つけようとしています。

「同じサーバーで同時にプレイする10000人に対応したい」と簡単に言うことができ、「サーバーごとに100がより現実的でありそうな数字です」と言うかもしれません。

そのため、何千ものリクエストとディスパッチを処理し、処理負荷を複数のマシンに分散するために、複数のサーバー/クラウドコンピューティングハブを考え出す必要があるかもしれないことを認識しています。したがって、データの受信のみを処理するマシンがいくつかあるかもしれません。巨大な中央ボックスは、すべての受信マシンとディスパッチマシン、そしてもちろん一連のディスパッチマシンによって何らかの形で共有されるインメモリデータベースのようなものです。

明らかに、技術的な限界があり、私はそれらが何を期待し、何であるかを本当に知りません。また、問題に追加のCPUとサーバーボックスを投入しても、必ずしも問題が解決するわけではありません。マシン間の相互通信が増えると、プロセスが少し遅くなるためです。より多くのCPUを投入すると、効果が低下し、あるしきい値でCPUの生産性が低下する可能性があると思います。

マルチプレイヤー用のP2P(Peer To Peer)を検討できますか?

一度に2500人のプレイヤーに対応できると言っているのは現実的ですか?

数年以内に10000人のプレイヤーにスケールアップすることは可能でしょうか?

この質問は非常に長いことを知っていますので、心からお詫び申し上げます。

0 投票する
2 に答える
704 参照

python - Twisted Spread はマルチプレイヤー レーシング シミュレーションに適していますか?

Twisted Spread は (パフォーマンスの点で) マルチプレイヤー レーシング シミュレーターに適していると思いますか? アプリケーションの残りの部分は、Python-Ogre に基づいています。

Perspective Broker は (信頼できる?) UDP で実行できますか?

0 投票する
3 に答える
748 参照

delphi - Datasnapは、最大8つの非通信集約型双方向マルチプレイヤーゲームに適していますか?

私は以下を必要とする小さなマルチプレイヤーを構築しています:

  • Delphiで作成する必要があります
  • インターネット接続をサポートする必要があります(LANだけでなく)
  • HTTPで動作する
  • パケットの暗号化をサポートします(カスタムの場合もあります)
  • サーバーにコマンドを送信できる
  • サーバーからの応答を受信できる
  • 1台のサーバーに最大8人のプレーヤーを接続できます
  • 複雑なオブジェクト(おそらくJSONシリアル化)をサーバーに渡すことができます

新しいDelphi2010Datasnapはこのシナリオで正常に使用できると思いますか、それとも古いTSocketを使用する必要がありますか?

0 投票する
2 に答える
3369 参照

python - シンプルな python-socket ベースのサーバーとクライアント間の時刻の同期

私は学習演習として Python で書いている小さなマルチプレイヤー ゲームの始まりを持っています。現在、サーバーは 10 fps で実行されますが、クライアントは好きな速度で実行されます。これは帯域幅を節約するためにうまく機能しますが、クライアントが入力が発生したときにサーバーに通知しない限り、すべての入力は 100 ミリ秒間隔に量子化されます。これらの修正を行うために、クライアントとサーバーの間で時刻を同期するにはどうすればよいですか? ここでの大きなハードルは、ping 時間を決定し、それらを補正する必要があることです。

0 投票する
4 に答える
4364 参照

c# - 浮動小数点演算を使用するマルチプレイヤー RTS ゲームで同期を維持する

C# で 2D 空間 RTS ゲームを作成しています。シングルプレイヤーが動作します。次に、マルチプレイヤー機能を追加したいと思います。私はそれをグーグルで検索しましたが、強力なネット接続なしで何千ものユニットを継続的に移動させる唯一の方法があるようです: すべてのプレイヤーで同じシミュレーションを実行しながら、ネットワークを介してコマンドのみを送信します.

そして今、エンジン全体がどこでも double を使用するという問題があります。また、浮動小数点計算はコンパイラの最適化と CPU アーキテクチャに大きく依存するため、同期を維持することは非常に困難です。そして、それはまったくグリッドベースではなく、宇宙船を動かすための単純な物理エンジンを備えています(宇宙船には衝動と角運動量があります...)。そのため、固定小数点を使用するように全体を再コーディングするのは非常に面倒です (ただし、おそらく唯一の解決策です)。

したがって、これまでのところ2つのオプションがあります。

  • 現在のコードに別れを告げ、整数を使用して最初からやり直す
  • 数千のユニットを持つ 8 人のプレーヤーを持つのに十分な帯域幅がある場合にのみゲーム LAN を作成し、(ほぼ) すべてのフレームで位置や方向などを送信します...

だから私はより良い意見を探しています(または、すべてを台無しにすることなくコードを固定小数点に移行するためのヒントさえも...)

0 投票する
3 に答える
131 参照

design-patterns - データの小さな変化を管理するには?

私は現在マルチプレイヤー システムを構築していますが、多くのオブジェクト間でデータの多くの小さなバリエーションを管理する方法について設計上の質問があります。

例から始めましょう。A、B、C の 3 人のプレイヤーがいるとします。A は B と友好的であり、C とは敵です。つまり、A が敵であることを C に示し、A が友好的であることを B に示す必要があります。現在、同じデータの 2 つの異なる (しかし小さい) バリエーションがあります。これはほんの一例です。別のバリエーションとして、A がステルス状態になり、B は A を見ることができますが、C は A を見ることができません。前述のとおり、これらは単なる例です。各オブジェクト間で主に変化する、より多くのさまざまなプレイヤー データの状態を持つことが計画されています。

これをどのように管理すればよいですか?大量の if ブロック、または私が見落としている明白な設計パターンはありますか? これはマルチプレイヤー ゲームであるため、3 人以上のプレイヤー/オブジェクトまたは状態が存在します。

0 投票する
3 に答える
1362 参照

iphone - iPhone mmorpg での高レイテンシー

現在、iPhone 用の mmorpg を作成しようとしています。iPhone がプレーヤーの位置を 1 秒間に数回要求するように設定しました。これを行う方法は、クライアントが非同期 NSURLConnection を使用して、mysql データベースから位置をロードし、それを json で返す php ページにリクエストを送信することです。ただし、位置が要求されてから実際に読み込まれるまでに約 0.5 秒かかります。これは非常に高いように思えますが、これを引き起こす可能性のある明らかな要因はありますか?

また、これにより、クライアントでのプレーヤーの動きも非常に不安定になります。プレイヤーの動きのぎこちなさを軽減するアルゴリズムや方法はありますか?

0 投票する
4 に答える
12086 参照

flash - Google App Engine をソケット サーバーとして使用できますか?

私のウェブホストにはソケットサーバーに対するルールがあるため、GAE を調べています。

GAE で正常に実行できるソケット サーバーを知っている人はいますか? 私はそれをフラッシュに使用しているので、可能であれば smartfox のようなものは素晴らしいでしょう。

ありがとう。

0 投票する
2 に答える
2547 参照

c++ - オブジェクト マネージャーのベスト プラクティス

私は C++ プログラミングが初めてで、オブジェクト マネージャーをマルチプレイヤー ゲームにコーディングしていますが、クライアント オブジェクトの管理方法について疑問があります。クライアント オブジェクトは、接続されたクライアント パラメータ (IP、接続時間、受信データなど) で構成されます。

メモリの断片化を避けるために、許可されているクライアントの最大数でオブジェクト プールを割り当てることを計画しています。そのために、次のようなクライアント オブジェクト マネージャーをコーディングしています。

このクラスは静的な方法でのみ呼び出されるため、コンストラクタ/デストラクタはありません。異なるタイプのオブジェクト間でクライアント データを読み取り/変更できることが必須であるため、このクラスは静的である必要があります。

実装は次のようになります。

では、get 関数でオブジェクトの戻り値を管理するにはどうすればよいでしょうか。それは参照による最良の選択肢ですか?ポインターを返したくありませんが、それが最後のオプションである場合は、それを受け入れることができます。プール内の登録済み (初期化済み) オブジェクトのみを確実に取得できると思いますが、get 関数でこのチェックが必要な場合はどうすればよいですか? コードを堅牢にし、実行時に停止しないようにしたいので、アサートは必要ありません (私は C++ を初めて使用するので、間違っていることを言っている場合は修正してください)。

メインプログラムでは、次のようなことを考えています:

私はそれを正しくやっていますか?ありがとう

注:
1) このコードは頭の中にあり、ここに入力したので、何か忘れている可能性があります。
2)プログラムは殺されることによってのみ終了するため(私はLinuxを使用しています)、メインプログラムでClientManager disposeメソッドが明示的に呼び出されることはありません(静的クラスであるため)。繰り返しますが、私が何か間違ったことを言っている場合は教えてください!
3) 私の悪い英語について申し訳ありません:)

0 投票する
4 に答える
5502 参照

android - Android でソーシャル マルチプレイヤー ゲームの開発を開始する方法

2人以上のプレーヤーを含むソーシャルゲームをAndroidで開発する方法を知りたいです。たとえば、チェスやスクラブルを考えてみましょう。このテーマに関するオンライン リソースやチュートリアルはありますか?