リアルタイムマルチプレイヤーゲームの実装にはどのような課題があるのか

StackOverflow https://stackoverflow.com/questions/90423

質問

マルチプレイヤーを作成した経験があります ターン制 ソケットを使ったゲームは好きですが、リアルタイムアクションゲームはやったことがありません。どのような追加の問題に対処する必要がありますか?遅れをとったプレイヤーが過去に何かをした場合に備えて、プレイヤーの行動の履歴を保存する必要がありますか?本当に UDP パケットを使用する必要がありますか、それとも TCP で十分ですか?ほかに何か?

何を作るかはまだ決めていませんが、この質問の目的としては、X Y 運動を伴う 10 人用の 2D ゲームを考えることができます。

役に立ちましたか?

解決

  • 「クライアントサーバー」または「ピアツーピア」、またはその中間:どのコンピュータがどのゲームのアクションに対して権限を持っているか。

ターンベースのゲームでは、通常、「サーバーが最終的な権限を持っているので、これで終わりです」と言うのは非常に簡単です。リアルタイム ゲームでは、多くの場合、その設計から始めるのが最適ですが、レイテンシーを追加するとすぐに、クライアントの動きやアクションが応答しなくなったように感じられます。したがって、その問題を解決するために、クライアントの入力がキャラクターやユニットに即座に影響を与えることを可能にするある種の「レイテンシーの隠蔽」を追加します。そして今度は、クライアントとサーバーのゲーム状態が乖離し始めたときに調整する問題に対処する必要があります。10 回のうち 9 回は問題ありません。クライアントが影響を与えたオブジェクトを権限のある位置にポップまたは lerp することはできますが、10 回に 1 回はオブジェクトがプレイヤーのアバターか何かである場合です。その解決策は受け入れられないため、開始します。クライアントにいくつかのアクションに対する権限を与えます。ここで、サーバー上の複数のゲーム状態を調整し、そのようなことを気にする場合は、悪意のあるクライアントを介した潜在的な「不正行為」に自らをさらす必要があります。これは基本的に、あらゆるテレポート/カモ/バグ/チートが発生する場所です。

もちろん、「すべてのクライアントが「自分の」オブジェクトに対する権限を持っている」というモデルから始めて、不正行為の問題を無視することもできます (かなりの場合は問題ありません)。しかし今では、そのクライアントがドロップアウトしたり、「シミュレーションに追いつくのに少し遅れただけ」の場合でも、ゲーム シミュレーションに多大な影響を与える可能性があります。事実上、すべてのプレイヤー ゲームが最終的に影響を受ける/感じることになります。遅れているクライアント、またはその他のパフォーマンスが低いクライアント。遅れているクライアントが追いつくのを待つか、制御しているゲーム状態が同期していない状態です。

  • 「同期」または「非同期」

すべてのプレイヤーが同じゲーム状態で動作していることを確認するための一般的な戦略は、(上記のモデルのいずれかを介して) プレイヤー入力のリストに単純に同意し、ゲームプレイ シミュレーションをすべてのマシンで同期して実行することです。これは、シミュレーション ロジックが正確に一致する必要があることを意味します。一致しないと、ゲームが同期しなくなります。これは実際、思っているよりも簡単でもあり、難しいものでもあります。ゲームは単なるコードであり、同じ入力 (乱数ジェネレーターであっても) を与えるとコードはほぼ同じように実行されるため、これは簡単です。そうでないケースが 2 つあるため、さらに難しくなります。(1) ゲーム シミュレーションの外で誤ってランダムを使用した場合、および (2) フロートを使用した場合。前者は、どのゲーム システムでどの RNG が使用されるかについて厳格なルール/アサーションを設けることで修正されます。後者は、float を使用しないことで解決されます。(float には実際には 2 つの問題があります。1 つは、プロジェクトの最適化構成に基づいて動作が大きく異なります。ただし、それが解決されたとしても、異なるプロセッサ アーキテクチャ間では動作が一貫性がありません (笑)。Starcraft/Warcraft および「リプレイ」を提供するゲームでは、おそらくこのモデルが使用されます。実際、再生システムを使用することは、RNG が同期を維持していることをテストする優れた方法です。

非同期ソリューションを使用すると、ゲームの状態当局はその状態全体を他のすべてのクライアントに一定の頻度でブロードキャストするだけです。クライアントはそのデータを取得し、それをゲーム状態に叩き込みます (そして通常は、次の更新を取得するまで、単純な推定を行います)。ここで、「udp」が実行可能なオプションになります。ゲームステート全体を約 1 秒ごとにスパム送信しているため、更新の一部をドロップしても意味がありません。ゲーム ステートが比較的少ないゲーム (quake、world of warcraft) の場合、多くの場合、これが最も簡単な解決策になります。

他のヒント

マルチプレイヤーの設定にはいくつかの要素が関係します

  1. プロトコルとして、TCP と UDP のどちらを使用するかを決定することが重要です。UDP はオーバーヘッドが少ないですが、配信は保証されません。逆に、TCP の方が信頼性が高くなります。各ゲームには優先プロトコルがあります。たとえば、UDP は一人称視点のシューティング ゲームでは機能しますが、情報の一貫性が必要な RTS には適さない可能性があります。

  2. ファイアウォール/接続。マルチプレイヤー ゲームで 2000 の送信接続を行う必要がなく、標準ポートを使用するため、ポート転送が簡単になります。Windows ファイアウォールと接続すると、おそらく追加のボーナスになるでしょう。

  3. 帯域幅。これは重要です。ネットワーク接続を通じてどれくらいのデータを送信するつもりですか?これは、再生テストと録音のスループットに依存すると思います。各クライアントに 200kb/s 以上を必要とする場合は、いくつかの点を再考する必要があるかもしれません。

  4. サーバーの負荷。これも重要ですが、通常のゲームではサーバーにどのくらいの処理が必要ですか?それを実行するには、16 GB の RAM を搭載したスーパー 8 コア サーバーが必要ですか?それを減らす方法はありますか?

他にもたくさんあると思いますが、実際には、ネットワークやさまざまな接続を介して快適にプレイできるゲームが必要です。

計画はあなたの親友です。あなたのニーズが本当に何なのかを理解してください。

データのロード:すべてのコンピュータが同じモデルとグラフィックスを持ち、名前と場所だけがネット上に移動されるのでしょうか。すべてのプレイヤーがキャラクターやその他のアイテムをカスタマイズできる場合は、このデータを移動する必要があります。

不正行為:心配する必要はありますか?それぞれのクライアントの発言を信頼できますか。そうでない場合、サーバー側のロジックはクライアント側のロジックとは異なるものになります。この単純なケースを想像してください。パワーアップにより、10 人のプレイヤーの移動速度がそれぞれ異なる可能性があります。不正行為を最小限に抑えるには、サーバーからの通信更新の間に各プレイヤーがどのくらいの距離を移動できるかを計算する必要があります。そうしないと、プレイヤーがそこをハッキングして速度が上がり、何も止めることができなくなります。プレーヤーが一貫して予想よりも少し速いか、または 1 回だけジャンプした場合、サーバーは、クロックのずれまたは通信の 1 回の中断の可能性が高いため、プレーヤーを可能な限り最も近い場所に再配置します。ただし、プレイヤーが常に可能な限り 2 倍の距離を移動している場合は、ゲームから追い出すことが賢明かもしれません。計算が増えれば増えるほど、サーバー上で再確認できるゲーム状態の多くの部分が増え、ゲームの一貫性が高まり、ついでに言えば不正行為も難しくなります。

ピアツーピアの仕組み:ゲームがピアツーピアになる場合でも、おそらく 1 人のプレイヤーがゲームを開始し、そのプレイヤーをサーバーとして使用することをお勧めします。これは、クラウド ベースのアプローチを管理するよりもはるかに簡単です。サーバーがない場合は、ゲーム状態が矛盾している 2 台のマシン間の紛争を解決するためのプロトコルを動作させる必要があります。

繰り返しますが、計画はあなたの親友です 計画、計画、計画。問題について十分に考えれば、ほとんどの問題を自分なりに解決することができます。その後、まだ解決していない問題について考え始めることができます。

不正行為を避けることはどのくらい重要ですか?[クライアントからの情報は信頼できますか、それとも信頼して認証できますか?]

オブジェクトモデルオブジェクトはあるマシンから別のマシンにどのように通信されるのでしょうか?オブジェクトに対するアクションはどのように実行されるのでしょうか?

クライアント/サーバーまたはピアツーピアを実行していますか?

乱数ピアツーピアを行う場合は、ロックステップを維持し、乱数を同期させる必要があります。

クライアント/サーバーを使用している場合、ラグにどのように対処しますか?[推測航法?]

ネットワークコーディングには、重要な問題がたくさんあります。

コードを無料でダウンロードできる RakNet とディスカッション グループの両方をチェックしてください。

LAN 上で実行する場合は、TCP で問題ありません。ただし、オンラインでプレイしたい場合は、UDP を使用し、独自の TCP のようなレイヤーを実装する必要があります。NAT ルーターを通過させる必要があります。

ピアツーピア通信またはクライアント/サーバー通信のいずれかを選択する必要があります。クライアント/サーバー モデルでは、同期と世界の状態の実装が簡単ですが、オンラインでの反応性が欠如する可能性があります。ピーツーピアでは、より複雑ですが、プレーヤーにとっては高速です。

ゲーム目的でプレイヤーのアクションの履歴を保持しないでください (ただし、リプレイ機能の場合のみ保持します)。必要な時点に達した場合は、すべてのプレイヤーを待たせることをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top