2秒のPingがある場合に完璧なヘッドショットをかける方法は? この記事で学習します。
現在のマルチプレイヤーアルゴリズム
- サーバーはクライアントからのコマンドとその送信時間を受け取ります
- サーバーは世界の状態を更新します
- サーバーは、一定の頻度でそのステータスをすべてのクライアントに送信します
- クライアントはコマンドを送信し、その結果をローカルで再現します
- クライアントは更新された世界の条件を受け取り、次のことを行います。
- サーバーから状態を適用します
- サーバーに適用する時間がなかったすべてのコマンドを再適用します。
- 他のプレイヤーの以前の状態を補間します
- プレーヤーの観点から、2つの重大な結果があります。
- プレイヤーは現在を確認します。
- プレーヤーは過去に 他の人を見ます 。
これは通常は正常に機能しますが、高い空間時間精度を必要とするイベントにとっては大きな問題になります。 たとえば、敵の頭を粉砕したい場合!
遅れ補償
そのため、狙撃ライフルを敵の頭に向けることができました。 トリガーを静かに引いて息を吐きました。 あなたは自分の能力に自信があり、見逃せません。
しかし、あなたは逃した!
なぜこれが起こったのですか? これはどのように起こりましたか?
実際、私たちが構築したアーキテクチャでは、敵の頭が射撃の時点ではなく、射撃の100ミリ秒前の場所を狙っています!
それは、光の速度が非常に小さく、ほんのわずかな世界での狙撃兵のようなものです。 あなたは相手を目指しますが、光があなたに届くまでに、彼は長い間彼の古い位置から消えていました。
神に感謝します。この問題にはかなり簡単な解決策があります。これはほとんどの場合、他のプレイヤーにも受け入れられます(1つの例外については後で説明します)。
仕組みは次のとおりです。
- 撮影すると、クライアントは、撮影時に表示されたサーバー状態時間を含むサーバーショットイベントを送信します。 そして、あなたの武器の正確な方向。
- これが重要な瞬間です。 サーバーは引き続きフレームごとに状態をクライアントに送信するため、過去からいつでも復元できます。 特に、彼はクライアントがショットの時に彼を見たのとまったく同じように世界を回復することができます。
- したがって、サーバーは配置されている位置に矢印を残します。 そして 、 残りの世界は、ショットの時点でクライアントが表示した状態、 つまり 時間に戻ります 。
- サーバーはショットを処理し、その結果を受け取ります。
- サーバーは、全世界を現在の状態に戻します。
- サーバーはショットの結果を適用し、通常どおりクライアントに更新を送信します。
そして誰もが幸せです!
サーバーであるため、サーバーは満足しています。 彼はいつも正しいので、彼はいつも幸せです。
射手は、敵の頭を狙い、1回の正確な射撃でそれを打ち破ったので幸せです。
不幸なのは死者だけです。 彼がショットの時点でじっと立っていたら、彼自身が責任を負うことになっていた。 彼が走った場合、あなたは良いシューティングゲームです。
しかし、彼が危険地帯を走り抜け、一瞬後に彼が安全だと思ったときに射殺された場合はどうでしょうか? 彼は怒ってしまいます。
これは起こる可能性があります。 これは、私たちがしなければならない妥協です。 射手は過去に彼を撃ったので、プレーヤーはすでに彼が角の後ろに隠れた後に撃たれることができます。
これは不誠実に聞こえますが、シューターの視点から、このプレイヤーはプレイヤーの視点からと同じ時間だけ広場を走ったことを覚えています。 唯一の違いは遅延です。
正確なショットが機能しなかった場合、さらに悪化します!
不条理のポイントに持ち込む
この方法は、巨大なpingでも機能することに注意することが重要です。
注意、トリックは専門家によって行われます! 本番サーバーではこのトリックを実行しないでください! 処方箋が2秒のチームは、実際に実行する必要はありません。
おわりに
マルチプレイヤーのようなものを正しく実行することは困難ですが、説明した概念を理解して武装していれば、実装するのに複雑なことはありません。
さらに読むための資料(英語):
ゲームのガファー
バルブのレイテンシ補正方法
翻訳者から
これで、 Gabriel Gambettaによる一連の記事が終了します。
しかし、私はあなたに別れを告げません。 ゲームワールドのシリアル化を構築する方法についての記事を執筆する予定です。実際、マルチプレイヤーなどの興味深いトピックの研究がどこにつながるかはわかりません。
UPD
krimtsevは非常に合理的な質問をしました。
FPSとPINGはこれがどのように影響するかを理解していますが、TICKRATEはどうですか?
答えます。 Bogotoffと私は、1秒あたり10回のサーバーリフレッシュレートでプレイするのは不便に思えたため、説明したアルゴリズムから離れることを許可しました。
クライアントで補間を使用して敵の位置を表示するため、実際にはプレイヤーがいくつかの2つの状態の間にある敵を撃っていたため、クライアントがレンダリングしたとされるサーバーの特定の状態を適用することは完全に正しいとは言えません。
遅延補正メカニズムを適用しているため、ショットが発生した世界の2つの状態を検出し、それらを補間するために使用できます。
したがって、毎秒1回サーバーを更新しても、適切に撮影できます。
もちろん、このサーバーの頻度でのゲームはひどいように見えます。 そうしないでください。 また、一般にFPSをできるだけ高く保ちます。 ゲームワールドのサンプリング周波数が高いほど、プレーヤーの高品質なゲーム体験が得られます。 私の個人的な私見は60以上ですが、もはや意味がありません。