私は 2 つの JavaScript カウントダウン タイマー (ゲーム用) と、いずれかからの AJAX 呼び出しからデータを受信するための MySQL テーブルを持っています。
プロセスは次のとおりです。
クライアントはタイマーを
data1
開始し、タイマーを開始するようにMySQL列に書き込みtime1
、現在のタイムスタンプを含む列を書き込みます(MySQLはそれを行わないため、PHP呼び出しから.01秒の精度で)もう一方のクライアント (サーバーを 2 秒間隔でポーリング) は変更を検出し、タイマーを開始しますが、すぐに減算します (カウントダウン タイマーです)
ctime - time1
。タイマーを開始したときに最初のクライアントが書き込みました。ctime
time1
この方法は、ポーリングの 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を使用したくありません。