7

私は 2 つの JavaScript カウントダウン タイマー (ゲーム用) と、いずれかからの AJAX 呼び出しからデータを受信するための MySQL テーブルを持っています。

プロセスは次のとおりです。

  1. クライアントはタイマーをdata1開始し、タイマーを開始するようにMySQL列に書き込みtime1、現在のタイムスタンプを含む列を書き込みます(MySQLはそれを行わないため、PHP呼び出しから.01秒の精度で)

  2. もう一方のクライアント (サーバーを 2 秒間隔でポーリング) は変更を検出し、タイマーを開始しますが、すぐに減算します (カウントダウン タイマーです) ctime - time1。タイマーを開始したときに最初のクライアントが書き込みました。ctimetime1

この方法は、ポーリングの 2 秒間隔によって引き起こされる遅延を排除することになっていますが、そうであるかどうかに関係なく (正直なところよくわかりません)、タイマー間の同期は異なります。完全に正確な場合もあれば、最大 3 秒ずれている場合もあります。(信頼性が低いです。)

私が使用している関連コードの一部を次に示します。

var timerRunning, timeRemaining, responseTime;

function restartLocalTimer() {
    var d = new Date();
    responseTime = d.getTime()/1000;
    timerRunning = true;
    timerTick();
}

function restartSyncTimer(resp) { // resp is the AJAX response passed
    var d = new Date();
    responseTime = d.getTime()/1000 - parseFloat(resp["ctime"]) + parseFloat(resp["time"]);
    timerRunning = true;
    timerTick();
}

function timerTick() {
    d = new Date();
    timeRemaining = 20 - d.getTime()/1000 + responseTime;
    if (timerRunning) setTimeout("timerTick()",25);
}

時間の値はすべて秒単位です。(データベースのため、後で ms に変更される可能性があります。)

私の質問は次のとおりです。説明していない追加の (重大な) 遅延はありますか? これを行うより良い方法はありますか?

また、注意してください:私はjQueryを開いています(すでにAJAX呼び出しに使用しています)が、websocketsを使用したくありません。

4

2 に答える 2

1

デスクトップ ネットワークのマルチプレイヤー ゲームと同じアプローチを取ります。接続が途切れる短い瞬間 (「ラグ」など) でも、クライアントはその間に予想される軌跡を投影します。この場合、ローカル間隔に依存し、非同期ハートビート応答を取得したときに正確なサーバー時刻で更新します。

于 2013-03-05T20:21:09.420 に答える
-1

setTimeoutそしてその兄弟は信頼できないことが知られています。これに関する別の投稿があります: Javascript タイマーを setTimeout よりも正確に作成する方法はありますか? それはいくつかの指針を与えます。

于 2013-03-05T20:21:14.613 に答える