クライアントをサーバーと相互に同期する


9

すべてのクライアントをサーバーと相互に同期させる最良の方法は何ですか?

現在、2つのアプローチが考えられています。

  1. クライアントがサーバーに何かを送信すると、サーバーはすぐにすべてのクライアントにメッセージを送信します。
  2. いくつかの時間遅延の導入により、サーバーはすべてのクライアントにメッセージを送信しますt

2番目のアプローチは、クライアントをよりよく同期させる可能性が高いようです(ある程度の遅延に対応しているため)。しかし、応答性が大幅に低下するかどうか(つまり、ユーザーが「ジャンプ」をクリックし、ボタンを押すことと実際にジャンプすることの間に顕著なギャップがある)かどうかと思います。

クライアントに自分の位置を計算させる可能性もあります(サーバーが「ジャンプした」と言うのを待たないでください)。しかし、避けられない遅延のために、クライアントは非常に非同期になります。

次に、TCPとUDPの全体の問題があります。私たちはそれを速くしたいのですが、あなたが思っていたのとは完全に異なる場所にいるとサーバーが言うのも嫌です。

これらのすべての競合する要求により、この問題への取り組み方は非常に不確実になります。これらのアプローチ(またはその他のアプローチ)のうち、クライアントとサーバーをすべて同期させるのに最適なのはどれですか。業界で実際に使用されているのはどれですか?

回答:


7

簡単に言えば、最善の方法はありません。

ゲームにはすべて異なるアーキテクチャが含まれています。すべてのゲームは、他のマシンと同期するために送信するデータの異なるセットを選択します。これは、ラグの処理方法を選択するときに行う選択に影響します。

オプション#2で指定するもの-クライアントが将来のアクションの対象となるメッセージを送信する-は間違いなく1つのアプローチです。実際、ソースエンジンはこのアプローチのバリアントを使用します。レンダリングは常にローカルクライアントアクションの100ms遅れます。すべてのマシンが同じアクションを同時に操作しようとします。これにより、実際のネットワーク遅延を隠すために、ゲームに人為的でわずかな遅延が追加されます。

このアプローチをとることができない場合は、オプション#1を選択して、最新のデータを送信し、受信時に、内挿と外挿(クライアント側予測)を使用して待ち時間を隠そうとすることもできます。私はこのアプローチを少なくとも1つの出荷ゲームで使用しましたが、すべてのゲームに依存します。あなたが取ることができる他のアプローチがあるかもしれません。

最後に、TCPとUDPのどちらかを選択する場合、おそらくUDPが必要です。TCP ゲームをネットワーキングするための実行可能なオプションであるシナリオがあります、アクションゲームを作成しているときは、できるだけ早く最新のデータが必要です。ドロップされたパケットを自分で処理できる場合は、UDPの方が適しています。(信頼できるパケットなど、TCPの機能を置き換えるためにUDPのラッパーを提供するENetなどのライブラリがあります。)


あなたは本当にUDPを使いたくないのです。正しく構成されたTCP接続のオーバーヘッドは最小限であり、順不同の配信である地獄は、誰もが経験する必要のないものです。
coderanger、2010

2
それはオーバーヘッドの問題ではありませんが、TCPは多少追加します-ドロップされたパケットをTCPが処理する方法は、アクションとリアクションの間の大きな待ち時間がプレイアビリティに大きな違いをもたらすゲームでは基本的に良くありません。アクションが比較的まれであるWoWのようなゲームの場合、TCPは機能しますが、CounterStrikeのようなゲームでは、1つのドロップされたパケットによって接続が抑制され、1秒以上「ラグアウト」する可能性があるため、横ばいになります。
Blair Holloway、

UDPを使用する場合は、自分で記述しないことをお勧めします。ENetのようなラッパーを使用します。しかし、私の元の答えはまだ残っています。UDPは、あらゆるペースの速いアクションでゲームを作成する場合に最適な方法です。
Blair Holloway、

私にとって、RakNetはゲームエンジンのUDP接続の実行を非常に簡単にしました。それはあなたがどのようにあなたのパケットを送りたいかについて多くのオプションを持っています。それらを注文する方法、ドロップされた場合にパケットを再送信する必要がある場合など
BarakatX2

3

これは、ひどいゲームネットワーキングをカバーするいくつかの優れたリンクです。

そして、これは、より実践的なネットワーキングシリーズの最初の部分です。 http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/

歴史について。「申し訳ありませんが、スパム防止メカニズムとして、新規ユーザーは最大1つのハイパーリンクしか投稿できません。さらに多くのハイパーリンクを投稿すると、10の評判を獲得できます。とにかく、彼のウェブサイトを見回してください。


1

クライアントとサーバーについて言及しているので、サーバーがすべてのオブジェクトの状態に対する権限であるクライアント/サーバーアーキテクチャについて話していると想定します。

注:代替は、オブジェクトの所有者がそのオブジェクトの権限であるピアツーピアアーキテクチャです。

クライアント/サーバーアーキテクチャを使用して移動オブジェクトを同期する方法は、すでに実証済みです。それは推測航法と呼ばれています。

これをゲームに実装する良い方法は次のようになります:

  1. クライアントはサーバーに入力を送信します。
  2. サーバーはゲームオブジェクト(加速と方向)を更新し、それらをクライアントに送り返します。
  3. クライアントはこれらの更新された値を使用して、オブジェクトの動きをローカルでシミュレートします。
  4. 時々、ドリフトを避けるためにサーバーが位置修正を送信します。
  5. リンス; 繰り返す。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.