プレーヤーの速度変更を送信するときにクライアントとサーバーを同期するにはどうすればよいですか?


10

クライアント側の予測を実装しています。ほとんどの説明は、クライアントが「プレーヤーを1ポジション上に移動する」のようなメッセージを送信することを前提としています。「プレイヤーのベロシティをxに設定」のようなメッセージを送信するとどうなりますか?

説明グラフィック;  送信されたメッセージと、クライアントとサーバー上の計算された位置を経時的に表示する

クライアントでは、サーバーよりも先にプレイ​​ヤーが(クライアント側の予測によって)自分の速度を設定するため、2つが同期しなくなります。この問題は、平均遅延を考慮しても解消されません。

どうすればこれに取り組むことができますか?

回答:


8

冗長データを送信する必要があります。これは、位置と速度を送信することを意味します。同期していない場合でも、位置と速度を持っているため、補間関数を使用して軌道を修正できます。

次に、遅延アニメーション、アクセラレーションなどのいくつかのトリックを使用すると、待ち時間を隠すことができます。

編集:サーバーは信頼できると思います。


ご回答有難うございます。はい、サーバーは信頼できますが、速度で冗長データを送信した場合でも、クライアントはエラーを修正できますが、「クライアント/サーバーがエンティティに共有コードを使用する場合、予測エラーは実際には発生しません」などのことをよく読みますが、私の場合、それらは常にわずかに発生し、それが全体的にどもる原因になります。
Blu3 2012年

1
@ user13842クライアントは常に同期しなくなります。Thelvynが言ったように、サーバーが送信するものに従って、クライアント側の位置と速度を修正する必要があります。そうすれば、クライアントが完全に同期していない限り、動きが途切れることはありません。修正に時間がかかりすぎるため、値をスナップする必要があります。
dreta 2012年

これが、補間関数を使用する主な理由です。待ち時間は避けられないため、スムーズに動きを修正する必要があります。クライアントとサーバーは世界をシミュレートしますが、クライアントはサーバーをリッスンして修正を実行する必要があります。ソースエンジンネットワーキングで使用されるいくつかの手法:developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn

このGoogleトークでも簡単に言及されていますが、youtube.com
watch?v

この特定の問題に対する別の解決策を見つけました。クライアントが各パケットで入力を適用した時間を追加します。意味#1の時間は0で、2番目の時間は100です。これでサーバーは、クライアントが前にではなく時間:100にボタンを押したことを認識します。
Blu3 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.