Php 将两个客户端JavaScript计时器与服务器同步
我有两个JavaScript倒计时器(用于一个游戏)和一个MySQL表来接收来自其中任何一个的AJAX调用的数据 过程如下:Php 将两个客户端JavaScript计时器与服务器同步,php,javascript,jquery,mysql,ajax,Php,Javascript,Jquery,Mysql,Ajax,我有两个JavaScript倒计时器(用于一个游戏)和一个MySQL表来接收来自其中任何一个的AJAX调用的数据 过程如下: 客户端启动计时器,将其写入data1MySQL列,以便 它启动计时器,并在time1列中显示当前 时间戳(精度为.01s,来自PHP调用,因为MySQL没有 这样做) 另一个客户端(每隔2秒轮询服务器)检测到更改,并启动计时器,但立即减去(倒计时)ctime-time1,其中ctime是第二个客户端调用的时间戳(也由PHP给出)time1是第一个客户端启动计时器时写入的时
data1
MySQL列,以便
它启动计时器,并在time1
列中显示当前
时间戳(精度为.01s,来自PHP调用,因为MySQL没有
这样做)ctime-time1
,其中ctime
是第二个客户端调用的时间戳(也由PHP给出)time1
是第一个客户端启动计时器时写入的时间戳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调用中使用了它),但不想使用WebSocket。我会采用桌面网络多人游戏所采用的方法。即使在连接中断的短暂时刻(例如“滞后”),客户也会在这段时间内预测预期的轨迹。在这种情况下,您依赖于本地间隔,并在获得异步心跳响应时使用准确的服务器时间进行更新。
setTimeout
及其兄弟被认为是不可靠的。关于这一点还有另一篇文章:它给出了一些指针。请注意,setTimeout只定期执行函数,但不执行任何与时间相关的计算。这是通过DateIt完成的,因为我认为您没有阅读我的代码,只看到setTimeout()并立即做出假设。这不是你发布答案的方式。也许是评论。你是对的,反应太快了。上周咬了我一口,所以我很快得出结论,这是一样的。好吧,这次我确实读了。首先:为什么要使用setTimeout(“timerTick()”,25)
?为什么不setTimeout(timerTick,25)
。setTimeout
的第一个参数接受函数句柄。第二:如果你在控制台中使用Google Chrome的时间线或网络页面,这是否有助于你确定造成延迟的原因,或者你是否已经尝试过了?好的,第一件事几乎只是美观,但无论如何,谢谢。至于时间线,我将更深入地研究它。resp[“time”]
是你倒计时的时间戳吗?是我倒计时的时间戳