Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将两个客户端JavaScript计时器与服务器同步_Php_Javascript_Jquery_Mysql_Ajax - Fatal编程技术网

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

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是第一个客户端启动计时器时写入的时

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

过程如下:

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

  • 另一个客户端(每隔2秒轮询服务器)检测到更改,并启动计时器,但立即减去(倒计时)
    ctime-time1
    ,其中
    ctime
    是第二个客户端调用的时间戳(也由PHP给出)
    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调用中使用了它),但不想使用WebSocket。

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

    setTimeout
    及其兄弟被认为是不可靠的。关于这一点还有另一篇文章:它给出了一些指针。

    请注意,setTimeout只定期执行函数,但不执行任何与时间相关的计算。这是通过DateIt完成的,因为我认为您没有阅读我的代码,只看到setTimeout()并立即做出假设。这不是你发布答案的方式。也许是评论。你是对的,反应太快了。上周咬了我一口,所以我很快得出结论,这是一样的。好吧,这次我确实读了。首先:为什么要使用
    setTimeout(“timerTick()”,25)
    ?为什么不
    setTimeout(timerTick,25)
    setTimeout
    的第一个参数接受函数句柄。第二:如果你在控制台中使用Google Chrome的时间线或网络页面,这是否有助于你确定造成延迟的原因,或者你是否已经尝试过了?好的,第一件事几乎只是美观,但无论如何,谢谢。至于时间线,我将更深入地研究它。
    resp[“time”]
    是你倒计时的时间戳吗?是我倒计时的时间戳