マルチプレイヤーレースゲームでのプレイヤー間の衝突


8

私は、p2.js、フェイザー、node.jsを使用して、シンプルなレーシングゲーム(宇宙船、無重力)を作成しています。

私がしたこと:クライアントはサーバーから世界の状態を受け取ります:

  • サーバーからの最新の速度/位置に基づいて他のプレイヤーを推定する
  • クライアント側の予測が正しいかどうかを確認します-サーバーからの適用位置がなく、サーバーが認識していなかった入力を処理します。
  • 固定物理ステップ

サーバ:

  • クライアントから入力を受け取り、適用する
  • 固定物理ステップ
  • 各クライアントに世界の状態を送信します

現在、プレイヤー同士の衝突に苦労しています。衝突しているプレイヤーは、衝突中に常にジャンプしています。クライアント側の予測がサーバーと同様の結果を計算していないためだと思います。

サーバーはプレーヤーからのすべての入力を認識していません(ラグ)。

プレーヤーとサーバーが衝突しているプレーヤーの位置が異なります(ラグ)。

この2つを組み合わせると、クライアントはサーバーとは異なる衝突を解決し、世界の状態が到着したときにプレーヤーは大きな修正を行う必要があります。


サーバーのタイムステップを増やして、少なくとも修正を少なくすることは可能でしょうか?プレーヤーにサーバーと同じデータ(最後に送信された位置と他のプレーヤーの予測位置)を使用させようとしましたか?
user3797758 2016年

提案:サーバーのみに衝突を計算させようとしましたか?クライアントは、データをレンダリングして送受信するためにのみ使用されます(もちろん、受信したデータに反応します)。
Greffin28

回答:


1

サーバー上でのみ物理演算を行います。次にワークフローの例を示します。

  1. クライアントは「ステアリング左」を押します。
  2. クライアントは「ステアリング左」リクエストをサーバーに送信します
  3. サーバーはデータを受信します。
  4. サーバーは、サーバー上のクライアントのインスタンスを左に誘導します。
  5. サーバーはプレイヤー間に衝突があることを検出します。
  6. サーバーは衝突に基づいて修正を行います。
  7. サーバーは位置データをクライアントに送信します。
  8. クライアントは位置データを受け取ります。
  9. クライアントが位置を調整します。

0

プレイヤーのインタラクションを瞬時に感じたい場合は、いくつかの選択肢があります。そうでない場合は、サーバー側で物理演算を実行します。

オプション1:クライアント側で衝突が検出され、衝突データがサーバーに送信されるか、直接他のクライアントに送信されます。特定のマルチプレイヤーシューターは、このような衝突検出を行います。そうしないと、射撃のメカニズムが正確に感じられないためです。

オプション2:サーバー側は物理演算を行いますが、さまざまな予測を行います。各プレーヤーのインスタンスをさらに使用して、わずかに異なることを実行するように予測できます。それらが自己衝突しないことを確認し、クライアントにデータを送信します。プレーヤーのモーションが予測と一致するたびに、クライアントに既に送信されているデータを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.