状態の差分(デルタ)と信頼できない接続の送信


8

私たちはリアルタイムのマルチプレイヤーゲームを構築しています。このゲームでは、各プレイヤーがゲームループの反復ごとにその状態を報告する責任があります。

状態の更新は、信頼できないUDPを使用してブロードキャストされます。

状態データの送信を最小限に抑えるために、デルタ(変更された状態データに関係なく)のみを送信するシステムを考え出しました。

ただし、パケットが失われると他のプレイヤーがデルタを受信できなくなり、ゲームが予期しない動作をするようになるため、この方法には欠陥があります。

例えば:

状態は次の要素で構成されていると想定します:{positionX、positionY、health}

Frame 1  - positionX changed --> send a packet with positionX only.
Frame 2 - health changed // lost !
Frame 3 - positionY changed --> send a packet with positionY only.

//他のプレイヤーは健康状態の変化について知らない。

では、どうすればこの問題を克服できるでしょうか?データ全体を送信することは常に可能であるとは限りません。

回答:


7

UDPを使用してデータを送信している場合でも、このような状況に対処するには、独自の形式の信頼性を追加する必要があります。UDPは、TCP通信の信頼性は高いが柔軟性に欠けるフォーマットを処理するのではなく、必要なことを実行する柔軟性を提供します。情報の受信が必要な場合は、確認メッセージまたは一種の確認応答パケットを使用する必要があります。そうしないと、クライアントは送信したデータを再送信する必要があるかどうかを知ることができません。たとえば、重要な情報を送信し、設定された期間内にそのデータの受信を確認する応答がない場合は、再送信します。


2
私に打ちのめします。ただし、位置やその他の物理データなど、かなり変動する値は保証する必要がないことに注意してください。特定のフレームで間違っている可能性があっても、とにかく次のフレームで修正されます。
jmegaffin 2013年

1
良い点、これはゲームで最も頻繁に見られます。キャラクターが突然新しい場所に非常に急速に移動する(または一緒にテレポートする)場合です。ほとんどのゲームはいくつかの異なる方法でそれを処理しますが、目標は同じです。サーバーがエンティティの位置を更新しただけで、クライアントはすぐに更新するか、数フレームにわたって非常に高いデルタ時間でエンティティを更新しています。
エヴァン

3

また、毎秒、サーバーからクライアントに完全な状態の更新を送信することで、問題を回避することもできます。クライアントがパケットを受信しなかった場合、完全な状態の更新を受信するまで、クライアントは正しく動作しません。その後、再び同期されます。


3

多くのゲームは、データの送受信にUDPとTCP / IPの両方を使用し、データの送信頻度に応じて、異なるプロトコルが使用されます。

例えば:

UDP:位置の更新、および毎秒複数回送信/受信される可能性のあるその他すべて。

TCP / IP:インベントリアクション、スペル/アビリティアクション(ほとんどのユーザーが実行したアクション)

それは本当に各アイテムのトラフィックの量に依存します。HPアップデートを非常に頻繁に送信している場合は、UDP上にある必要があります。


1
TCPは、大きなラグスパイクを引き起こす可能性があるため、リアルタイム精度が必要な場合には通常使用されません。
TheNickmaster21 2013年

パケットが確実に届くようにしたい場合に適しています。位置更新のようなものはそのためには適していませんが、ユーザーが特定の時間にボタンを押したことを確認したい場合は、TCPがすべてのエラーチェックと、パケット損失を回避するためにUDPに実装する必要があるその他のことを処理します。
UnderscoreZero 2013年

有効なポイント。UDPを変更したいだけです。
TheNickmaster21 2013年

1

Quake 3のソースコードのレビューを読んだ場合、彼はあなたのデザインに非常に似ているネットワークモデルを説明しますが、ドロップされたパケットの解決策があります。

基本的に、モデルでは、直前の状態に対してデルタを送信しています。quake3モデルでは、ピアから最後の確認応答状態に対してデルタを送信します。

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