7

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

过程如下:

  1. 客户端启动计时器,写入它的data1MySQL 列以便它启动计时器,以及time1具有当前时间戳的列(精度为 0.01 秒,来自 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。

4

2 回答 2

1

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

于 2013-03-05T20:21:09.420 回答
-1

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

于 2013-03-05T20:21:14.613 回答