繁体   English   中英

将两个客户端JavaScript计时器与服务器同步

[英]Synchronise two client side JavaScript timers with server

我有两个JavaScript倒计时器(用于游戏)和一个MySQL表来接收来自任何一个AJAX调用的数据。

该过程如下:

  1. 客户端启动计时器,写入它的data1 MySQL列,以便它启动计时器,并使用当前时间戳的time1列(精度为.01s,来自PHP调用,因为MySQL没有这样做)

  2. 另一个客户端(以2秒为间隔轮询服务器)检测到更改,并启动计时器,但立即减去(它是倒数计时器) ctime - time1 ,其中ctime是第二个客户端调用的时间戳(也由PHP给出)和time1是第一个客户端启动计时器时写入的时间戳。

这种方法应该消除由轮询的2s间隔引起的延迟,但无论它是否存在(我真的不确定),定时器之间的同步会有所不同。 有时它们确实是死的,有时它们最多可以消失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。

我会采用与桌面网络多人游戏相同的方法。 即使在连接中断的短暂时刻(例如“滞后”),客户也会在该时间内投射预期的轨迹。 在这种情况下,您依赖于本地间隔,并在获得异步心跳响应时使用确切的服务器时间进行更新。

众所周知, setTimeout和它的兄弟是不可靠的。 还有另外一篇文章: 有没有比setTimeout更准确的方法来创建Javascript计时器? 这给了一些指示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM