web-dev-qa-db-ja.com

マルチプレイヤーゲームの同期

サーバー/クライアントアーキテクチャを実装しました。すべての状態変更が関数に送信され、検証されて、接続されているすべてのクライアントにブロードキャストされます。これはかなりうまく機能しますが、システムは現在、ゲームのクライアントインスタンス間の同期を維持していません。

サーバーと特定のクライアントの間に5秒の遅延が発生した場合、残りのクライアントの5秒後に状態変更を受信するため、ゲームの状態が同期しなくなります。クライアント間で同期システムを実装するためのさまざまな方法を探していましたが、今のところあまり見つかりませんでした。

私はネットワークプログラミングに不慣れであり、それにかなりの時間を費やすことなく自分で動作するシステムを発明できると考えるのはそれほど単純ではありません。しかし、私が持っていたアイデアは、ある種の時間システムを維持することです。そのため、各状態の変化は、ゲーム内の特定のタイムスタンプに関連付けられます。そうすれば、クライアントが状態の変化を受け取ったときに、ゲームのどの期間に変化が起こったかを正確に知ることができ、次にラグを関連付けることができます。この方法の問題は、これらのn秒のラグでは、ゲームがクライアント側で続行されていたため、クライアントは状態の変化に合わせて更新するために時間内にロールバックする必要があることです。散らかっています。

だから私はそれを解決する主題やアルゴリズムについて議論している論文を探しています。おそらく、サーバーから概念を受け取らない限り、クライアントのゲームインスタンスを更新すべきではないという意味で、マルチプレイヤーシステムの動作に関する私の全体的な設計に欠陥がありますか?現在、クライアントは、状態が変更されていないと想定して、ゲームループで自分自身を更新するだけです。

32
Kasper Holdum

これに対する基本的なアプローチは 推測航法 と呼ばれるものであり、それに関する非常に素晴らしい記事がここにあります。基本的には、サーバーの更新間の時間にエンティティの位置が推測される場所の予測アルゴリズムです。

この概念に基づいたより高度な方法論がありますが、それは良い出発点です。


また、これがソースエンジン(最初のHalf LifeゲームのValveのエンジン)でどのように処理されるかの説明もあります ここ 、原理は基本的に同じです-サーバーが別の方法で予測を使用するように指示するまでエンティティを予想されるパスに沿って移動するアルゴリズム-ただし、この記事では、これが何かをより深く撮影しようとする場合の影響について説明します。

16
Martin Harris
11
Kevin

複数の視点間でリアルタイムに完全な同期を保証する方法はありません。物理法則により不可能になっています。太陽が今爆発した場合、アルファケンタウリの観測者が、地球と同じように超新星を見ることができることをどのように保証できますか?情報の移動には時間がかかります。

したがって、視聴者ごとに異なる可能性のあるレイテンシですべてを正確にモデル化するか(現在の状態)、レイテンシなしで不正確にモデル化し、ビューア間で広く同期するか(予測/推測航法/外挿が行われる場所)を選択します。に)。リアルタイム戦略のような遅いゲームは最初のルートに行く傾向があり、速いゲームは2番目のルートに行く傾向があります。

特に、移動にかかる時間が一定であると思い込まないでください。つまり、どちらのモデルでも、エンティティを移動するために開始メッセージと停止メッセージを送信するだけでは不十分です。受信者が予測と補間のエラーを修正できるように、実際の状態の定期的な更新を送信する必要があります(通常、より高速なゲームの場合は1秒間に数回)。

6
Kylotan

サーバーがフィードしている速度でイベントが発生していることをクライアントが確認した場合、これは通常の方法です(Ultima Online、KalOnline、およびWorld of Warcraftのプロトコルを使用しました)。この瞬間的な5秒の遅延他のプレイヤーは、出力が遅れた場合、彼が短い距離を非常に速く「歩いている」のを見るので、彼にこの5秒間のイベントを一度に受信させ、それらのイベントが非常に速くまたはほぼ瞬時に通過するのを見るだけです。その後、すべてが再び正常に流れます。実際、グラフィックと物理の正規化を除いて、正しく同期させるための特別なニーズは見当たりません。同期するだけです。

近くの2台のコンピューターでValveゲームをプレイしたことがある場合は、「死んだ正確な場所」や「死体のギブが飛んだ場所」などの細部をあまり気にしないことに気付くでしょう。それはすべてクライアント側に任されており、レイテンシーの影響を完全に受けますが、これは関係ありません。

結局のところ、遅れたプレイヤーは自分の状態を受け入れるか、いまいましいeMuleを閉じる必要があります。

2
Havenard

最善のオプションは、変更を将来からクライアントに送り返すことです。これにより、ラグの問題がない他のクライアントの場合と同じ時点でクライアントに到達します。