5

Windows Phone 7 用のマルチプレイヤー ゲームを作成しています。イベントが各プレイヤーに対して同時に発生するようにする必要があります。現時点での私のアプローチは、イベントを開催したい時間を事前にブロードキャストし、電話の時計がかなり正確であることに依存することです。

問題は、時計が正確でない状況をいくつか見たことがあることです。数秒ずれている可能性があります。そこで私がやりたいのは、電話の時計の時刻がサーバーの時刻とどの程度異なるかを見積もることです。もちろん、ネットワーク レイテンシを考慮に入れる必要があります。特に、私が利用できる唯一のネットワーク プロトコルは Http であるためです。

私の質問は、クライアントとサーバー間のクロック時間の差を約 100 ミリ秒の精度で推定するために使用できるアルゴリズムを知っている人はいますか?

数学の学部生時代から、定数とエラー量 (レイテンシ) で構成されると想定される値をサンプリングするこの状況で使用できる統計モデルがあったことを覚えているようです。何らかの分布に従うと仮定されます。誰かがこれについて知っていますか、そしてそれは実際に適用されますか?

4

2 に答える 2

9

Christian のアルゴリズム( aaa の回答にリンクされているプレゼンテーションで発見) は、まさに私が必要としていたものであることが判明しました。

私のブログでは、サーバー側で WCF Rest を使用し、クライアント側で RestSharp と Reactive Framework を使用して、完全な (そして、自分で言うならかなりエレガントな!) 実装を行っています。

アルゴリズムを説明するブログ投稿からの抜粋を次に示します。

  1. クライアントはサーバーにメッセージを送信します:「今何時ですか?」[「氏を追加します。Wolf' はオプションです]。重要なのは、メッセージを送信した時刻を記録することです (これを T sentと呼びます) 。
  2. サーバーは可能な限り迅速に応答し、独自のクロック T serverに従って時間を提供します。
  3. Client がメッセージを受け取ると、受信時刻を記録します (これを T receivedと呼びます)。次に、いくつかの計算を行います。ラウンドトリップ時間 (RTT) は、T received – T sentです。したがって、サーバーが即座に応答し、ネットワーク遅延が両方向で同じであると仮定すると、サーバーが実際にメッセージを RTT/2 秒前に送信したことを意味します。したがって、クライアントがメッセージを受信した瞬間、サーバーでの時間は T server + RTT/2 になります。その後、クライアントは自身のクロックと比較して、違い (クロック スキュー) を判断できます。
于 2011-03-25T13:26:08.097 に答える
0

統計モデル/アルゴリズムではありませんが
、サーバーへの呼び出しにかかった時間を記録し、応答を返すことでこれを行います。

次に、この時間の半分を使用して (リクエストを送信するのに応答と同じ時間がかかると仮定して)、違いを推定します。デバイスの実際の時間でハーフタイムスパン値をサーバーに渡し、サーバーに違いを解決させます(このハーフタイムスパンオフセットを考慮して)。

これは、サーバーへの 2 番目の呼び出し (タイムスパンが半分の呼び出し) が、最初の (時間指定された) 要求と同じくらいの時間がかかることを前提としています。Web ファーム、ロード バランサー、またはサーバーの負荷が不均等であると、これが損なわれる可能性があります。
余分な遅延を避けるために、このプロセスを実行するためのメソッドができるだけ他のことをしていないことを確認してください。

複数の呼び出しを行い、時間の平均を使用してさまざまな要求時間を説明することができます。これが価値があるかどうか試してみてください。

それはすべて、必要なものがどれだけ正確かによって異なります。本当に (ほぼ) 完璧な精度が必要な場合は、運が悪いかもしれません。

于 2011-02-22T09:21:07.180 に答える