Javascript-测量FPS并将其与事件同步

Javascript-测量FPS并将其与事件同步,javascript,timer,sync,Javascript,Timer,Sync,让我们假设我有一个这样的游戏循环 function update(){ myTime = Date.now() - myTime // use myTime as you wish... // reset myTime myTime = Date.now() } 事情发生在那里,理想的速度是60帧/秒,但并不总是如此。现在我需要知道一帧和另一帧之间发生了多少毫秒。原因如下: 我有一个变量X,这个变量应该线性增加,每1秒增加480个单位。这个增加应该尽可能平滑,所以我认为应该是每毫

让我们假设我有一个这样的游戏循环

function update(){

myTime = Date.now() - myTime

// use myTime as you wish...


// reset myTime
myTime = Date.now()  

}
事情发生在那里,理想的速度是60帧/秒,但并不总是如此。现在我需要知道一帧和另一帧之间发生了多少毫秒。原因如下:

我有一个变量X,这个变量应该线性增加,每1秒增加480个单位。这个增加应该尽可能平滑,所以我认为应该是每毫秒0,48


考虑到我每16,6毫秒60帧就画一次屏幕,我该怎么做呢?我需要通过添加0,48*16,6来补偿吗?或什么样的福鲁姆拉?我快发疯了,提前谢谢你

我不确定我是否明白这个问题,但也许这会有帮助

要获取函数上次运行以来的时间,可以执行以下操作:

var lastTime = Date.now();

function update(){

    //do stuff here

    var myTime = Date.now(),
        timePassed = myTime - lastTime; //time passed since last time
    lastTime = Date.now(); //set for next time
}
var lastTime = Date.now(), framerate=1;

function update(){

    //do stuff

    framerate++;
    if ((Date.now()-1000)>lastTime) { //if a second or more has passed
        console.log(framerate); //log number of times function has ran
        framerate=0;  //and reset values
        lastTime = Date.now();
    }
}
​要查看函数每秒运行的次数,请执行以下操作:

var lastTime = Date.now();

function update(){

    //do stuff here

    var myTime = Date.now(),
        timePassed = myTime - lastTime; //time passed since last time
    lastTime = Date.now(); //set for next time
}
var lastTime = Date.now(), framerate=1;

function update(){

    //do stuff

    framerate++;
    if ((Date.now()-1000)>lastTime) { //if a second or more has passed
        console.log(framerate); //log number of times function has ran
        framerate=0;  //and reset values
        lastTime = Date.now();
    }
}
要加入这些功能,请执行以下操作:

var lastTimeEach = Date.now(), lastTimeSecond = Date.now(), framerate=1, x=480;

function update(){

    //do game logic

    var myTime = Date.now(), //time now
        timePassed = myTime - lastTimeEach; //time passed since last iteration
    lastTimeEach = Date.now(); //reset for next iteration

    framerate++;
    if ((myTime-1000)>lastTimeSecond) { //one second has passed
        x += 480; //add 480 to x
        framerate=0; //reset framerate
        lastTimeSecond = Date.now(); //reset for next second
    }
}​

这是一个

你在用什么引擎运行游戏?纯JS?是的,纯JS。这是一个视觉音乐播放器,我正在研究。。。1/4的绝对midi时间为480个单位。很容易知道,很难让它工作!谢谢然而,我想增加X线性,尽可能平滑。不仅仅是每秒一次拍摄480次,而且,例如,从上一帧开始,经过的毫秒数为480/1000*。等等,我也在准备一个JSFIDLE…在这里,应该每1秒做一个点,但它们也应该以恒定的速度移动。。。怎么,为什么这跟我的时钟不同步?在我的脚本中,我不使用Math.round,但myTime始终是一个整数,通常在17左右。大多数服务器端或基于操作系统的计时函数都非常精确。另一方面,Javascript并没有那么多。Javascript中的计时器永远不会得到准确的时间,总会有一些不准确的地方。我没有测试Date.now函数的准确性,但我认为它与其他计时事件相同。你得到的越低,它就越不准确。如果可能的话,您可以在一个时间间隔内增加x变量,但是您可能仍然需要每隔一秒左右检查并更正它。