マルチプレイヤープラットフォーマー-サーバー上の単一のクライアントでサーバーの修正が通常必要ですか?


10

私は現在、かなりシンプルなマルチプレイヤープラットフォーマーに取り組んでいます。私は待ち時間を隠すために使用される手法に関する記事をかなり読みましたが、それでも特定の概念を理解することができません。私はこのトピックが非常に興味深く、自分でアイデアを試したいと思っていますが、私の質問にはgamedev stackexchangeに尋ねる方が効率的だと思います。私の現在の状況と、その過程でどんな質問が生じたかを説明するために最善を尽くします。

現時点では、サーバーと同期するプレーヤーを1つだけにしたいと思っています。理論的には、クライアント側の予測を使用するプレイヤーは、自分の動きに影響を与える外部要因がないため、サーバーの修正は不要であると想定しました。したがって、私のプロトタイプでは現在、サーバー修正を送信せずにサーバーと同期しているプレーヤーは1つだけです。

ゲームネットワーキングに精通している場合は、コンテキストセクションをスキップすることもできますが、途中で問題が発生した可能性もあります。

クライアントループ(フレームごとに1回、〜16.67msごとに1回)

単純化されたクライアントループは次のようになります。

  1. ローカル入力(WASD)を確認し、アクション(例:)としてパッケージ化しますType=MoveLeft, Time=132.0902, ID=15。後で送信するために、パッケージ化されたアクションを保持します。また、目的のアクションをゲームのローカルの物理シミュレーションに直接適用します。たとえば、MoveLeftアクションがある場合、プレーヤーの速度を左に向けて力を加えます。

  2. チェックしてアクションを送信します。クライアントの帯域幅を乱用しないようにするには、パッケージ化されたアクションを特定の間隔(30msなど)でのみ送信します。

  3. サーバーの変更を適用します。ある時点で、これはサーバーが受け取ったデルタと修正を処理し、それらをゲームのローカルシミュレーションに適用します。この特定の質問では、これは使用されません。

  4. ローカル物理学を更新します。メインプレーヤーで物理ループを実行します。基本的に、これはプレイヤーの動きのクライアント側の予測を行います。これにより、プレーヤーの速度に重力が追加され、プレーヤーの速度が位置に適用され、途中で衝突が修正されます。物理シミュレーションは常に固定デルタ秒で実行されることを指定する必要があります(実際のデルタ秒に応じて複数回呼び出されます)。 。

物理学およびその他のセクションについては、質問には必要ないと感じたため、いくつかの具体的な詳細はスキップしますが、質問に関連するかどうかは、遠慮なくお知らせください。

サーバーループ(15msごと)

単純化されたサーバーループは次のようになります。

  1. アクションを処理します。クライアントから受け取ったアクションパッケージを確認し、サーバーの物理シミュレーションに適用します。たとえば、5つのMoveLeftアクションを受け取ることができ、力を速度に5回適用しますアクションパッケージ全体が1つの「フレーム」実行されることに注意してください。これは、アクションが発生するとすぐに適用されるクライアントではなく、

  2. ゲームのロジックを更新します。ゲームの物理演算、プレーヤーの移動、衝突の修正などを更新します。また、後でプレーヤーに送信された重要なイベント(プレーヤーのヘルスの低下、プレーヤーの死亡など)もパッケージ化します。

  3. 修正を送信します。私たちは定期的に(たとえば、35ミリ秒ごとに)デルタを他のプレーヤー(たとえば、プレーヤーの位置、ヘルスなど)に最近変更した場合に送信します。この部分は現在実装されていません。クライアント側の予測が適切に機能することを確認するために、単一のプレーヤーのシミュレーションで修正なしでクライアントとサーバーで同じ結果が得られるようにしたいのです。

問題

現在のシステムは単純な状況では問題なく機能し、単純な水平移動でも非常によく似た結果が得られたことを嬉しく思います(この不正確さは浮動小数点の精度エラーが原因であると思います)。

同期は単純な衝突/移動でうまく機能します

プロトタイプのグラフィックは無視してください。白い長方形=プレーヤー、赤い長方形=障害物、青い=背景

しかし、ジャンプしたり、孤立した障害物に近づいたりするなど、時間に敏感な動きをした後、同期エラーが発生します。

時間に敏感な瞬間に指定された障害物を飛び越えたため、同期が機能しません

理論的には、クライアントの立場に影響を与える外部要因がないため、どちらも常に同じ結果になると予想します。しかし実際には、問題は理解できたと思います。

そのような障害物の周りをジャンプすることは、プレーヤーのタイミングに大きく依存するため、速度がその位置に適用されたときの小さな変動は、結果に繰り返し実行されます(たとえば、クライアントは、サーバーは後でアクションパッケージ全体を受け取り、障害物にしばらく留まり、最終結果を変更するため、サーバーはそれを行います)。クライアントとサーバーがそれを処理する方法の違いは、サーバーがそれらを受信するときに、サーバーがそれらをすべて一括して実行するのに対し、クライアントはそれらが発生するとすべてのアクションを実行することです。

質問

この長いコンテキストは最終的に私の質問につながります(ここまで読んでいただきありがとうございます):サーバーと同期しているプレーヤーが1人だけの場合でもサーバーの修正が必要ですか、それとも特定の手法を使用して時間に敏感な状況での非同期を回避する必要がありますか?

私はいくつかの可能な解決策を考えましたが、そのいくつかは私にはあまり満足できません:

  1. サーバー修正を実装します。これが正常な動作であると単純に想定し、発生したエラーを修正してください。とにかくそれを実装したかったのですが、これまでに行ったことを受け入れられるようにしたかっただけです。

  2. 提供されたクライアント時間を使用して、目的のアクションを適用します。これはラグ補償と似ていると思います。「時間をさかのぼって」動きをチェックする必要があります。サーバーの修正を適用するようなもので、時間を遡り、その後の次のアクションを再適用します。本当に嫌いです。それは複雑でリソースが高価に見え、クライアントの指定された時間を信頼する必要があります(ただし、時間がかなり合法に見えることを実際に確認する予定ですが)。

  3. GameDevelopment StackExchangeに、私のすべての問題を解決する優れた新しいアイデアを求めてください。

私はゲームネットワーキングの世界を始めたばかりなので、上記のコンセプトを修正、批判、侮辱したり、ワンダフルワールドオブネットワーキングの旅に役立つアイデアやリソースを提供したりしてください。他の場所で自分の答えを見つけることができたとしたら、失礼します。

貴重なお時間をありがとうございました。


サーバーとクライアントは異なる速度でフレームを実行します。クライアントが連続するフレームで2つのアクションを実行したが、サーバーがそれらの間に1フレームのギャップを見つけた場合はどうなりますか?
user253751 2015

この影響を最小限に抑えるために、@ immibisgafferongames.com/game-physics/fix-your-timestepをベースにしています。
ジェシーエモンド2015

回答:


11

このような場合は、クライアントにわずかな権限を与えた方がよい場合があります。そのような正確な制御では、本当に高度な補正と予測を行っても、良い動作が得られる可能性はほとんどありません。

クライアントは、「ジャンプした」メッセージを送信するだけでなく、「時間TにX、Yからジャンプした」メッセージを送信するまで拡張する必要があります。次に、サーバーは場所が時刻Tにプレイヤーがいたと考えている場所(過去のかなり短い時間に制限できます)に近接していることを確認して、不正行為から保護し、クライアントの位置からのジャンプをシミュレートします送信されました。サーバーがクライアントを修正するのは、それが(通常はラグなどが原因で)打ち負かされていない場合のみです。

この種の手法は、ローカルクライアントでのゲームの応答性を高め、リモートクライアントでスムーズに見えるようにするために、修正および補間と組み合わせて使用​​されます。


とても興味深い。私はこれを実装して、それがどうなるかを見ていきます。お時間を割いていただき、誠にありがとうございます。ちなみに、「至近距離」と「過去のかなり短い時間」とおっしゃっていましたが、それぞれ距離と時間を一定にして確認してみませんか?または、ポジションの履歴を保持したり、クライアントの平均ラウンドトリップ時間を使用したりするなど、より高度な手法を使用しますか?
ジェシーエモンド2013

あなたのゲームで何がうまくいくか。シンプルに始め、必要と思われる程度にまで複雑にします。一部のサーバーは~max(RTT)、過去のサーバーティックのスナップショット履歴を保持していますが、ゲームで特に必要かどうかはわかりません。これは、クライアントである程度のヒット/ショット検出を行い、プレーヤーが46ミリ秒前の場所だけでなく、ターゲットが46ミリ秒前の場所やその他の場所も知る必要があるシューティングゲームスタイルのゲームにさらに便利です。閉塞プラットフォームをどこに移動するか。
Sean Middleditch 2013

完璧です。実験をして、何が一番うまくいくか見てみましょう。承認された回答としてマークします。ありがとうございます。
ジェシーエモンド2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.