2009-04-21 7 views
7

私はActionScript 3で記述しているゲームエンジン用のC#サーバーアプリケーションで作業しています。私は不正行為を防止し、確実に公正なゲーム。これまではすべてがうまくいきます:C#でサーバーとクライアントの間の待ち時間を取得するには

クライアントが移動を開始すると、サーバーに通知され、ローカルでレンダリングが開始されます。サーバは次に、クライアントXが移動を開始したことを他の人に知らせ、細部の中でレンダリングを開始することもできます。クライアントが移動を停止すると、サーバーはクライアントに移動開始時刻とクライアントがチック遅延を表示して全員に返信するため、正しい値で更新できるように計算を行います。

サーバーの計算でデフォルトの20msのチック遅延を使用すると、クライアントがかなり遠くに移動すると、停止時に目立つチルトフォワードがあります。遅延を22msにわずかに増やすと、私のローカルネットワーク上ではすべてが非常にスムーズに実行されますが、他の場所ではまだ傾きがあります。少し実験したところ、余分な遅延はクライアントとサーバーの間の待ち時間に結びついていることに気付きました。私はそれを非常にうまく動作する式に煮詰めました:遅延= 20 +(レイテンシ/ 10)。

したがって、特定のクライアントとサーバー(私は非同期ソケットを使用しています)との間のレイテンシを取得するにはどうすればよいでしょうか。 CPUの負荷をあまり大きくすることはできません。また、これは本当に最善の方法ですか、これを行うにはより効率的で簡単な方法がありますか?

答えて

12

申し訳ありませんが、これはあなたの質問に直接答えるものではありませんが、一般的に言えば、非常に可変である可能性があるため、 。それだけでなく、測定するping時間が対称であるかどうかはわかりませんが、これは重要です。 20msのping時間が実際にはサーバーからクライアントに19ms、クライアントからサーバーに1msであることが判明した場合、10msのレイテンシ補正が適用されます。アプリケーションの待ち時間はネットワーキングの用語と同じではありません。特定のマシンに対してpingを実行して20ms以内に応答を得ることができますが、そのマシン上でネットワーク入力を50回しか処理しないサーバに接続している場合あなたの応答は余分な0から20ミリ秒遅れるでしょう、そして、これはむしろ予期せず変化します。

レイテンシの測定には予測を平滑化する場所がありませんが、問題を解決するつもりはないので、ちょっときれいにしてください。

ここでの問題は、最後のメッセージが受信されるまでの間にデータを推定するために使用する最初のメッセージの情報が送信されているように見えます。他のすべてが一定のままであれば、最初のメッセージに与えられた動きベクトルにメッセージ間の時間を掛けた動きベクトルは、クライアントが現在の位置(レイテンシ/ 2)で正しい最終位置になります。しかし、待ち時間がまったく変わった場合、メッセージ間の時間は伸び縮みします。クライアントは彼が10単位移ったことを知っているかもしれませんが、サーバは彼が10単位に戻るように言われる前に9単位または11単位を動かすようにシミュレートしました。

これに対する一般的な解決策は、待ち時間が一定に留まらず、定期的な位置更新を送信することではなく、サーバがクライアントの位置を確認して修正できるようにすることです。今のところ2つのメッセージだけで、すべてのエラーが見つけられ、2番目のメッセージの後に修正されます。より多くのメッセージを使用すると、より多くのサンプルポイントにエラーが広がり、よりスムーズで目立たない修正が可能になります。

これは決して完璧ではありません。動きの最後のミリ秒でラグスパイクが発生し、サーバーの表現がオーバーシュートします。過去の出来事に基づいて将来の動きを予測している場合は、情報が旅行に時間がかかるため、正しいか遅れているか、間違っているか間違っているかを選択する本当の選択肢はないので、 (アインシュタインを非難する)

+0

+1 "責任アインシュタイン"。 –

2

サーバーからクライアントにメッセージを送信し、応答を取得するのにかかる時間を測定する「ping」コマンドがあります。 CPU負荷のシナリオを除けば、かなり信頼性が高いはずです。一方向のトリップ時間を得るには、時間を2で割ってください。

+1

アプリケーションによっては、ほとんどすべてのメッセージが、1518バイト程度を超えることなく、pingサブパケットを伝送できます。これにより、変化するネットワーク天気に自動的に適応することができます。 –

4

既に利用可能なPingクラスを使用することができます。自分のIMHOを書くよりも優先されるべきです。 ICMPベースpingsを使用する際に留意すべき

4

一つは、ネットワーク機器は、多くの場合、パケットは、WANリンクなどのネットワークの境界を越える場合は特に、ICMPトラフィックに通常パケットよりも低い優先順位を与えるということです。これは、トラフィックが実際に経験しているよりも、パケットがドロップされたりレイテンシが高くなったりするため、測定ツールではなく問題の指標になります。

ネットワークでのQuality of Service(QoS)の使用の増加はこれを悪化させるだけであり、結果としてpingは依然として有用なツールですが、非ICMPのネットワーク遅延の真の反映ではない可能性があることを理解する必要があります実質トラフィック。

これについては、ItrinegyブログHow do you measure Latency (RTT) in a network these days?に投稿があります。

関連する問題