Javascript 当我需要时间间隔非常精确时,有没有比setInterval更好的解决方案?

Javascript 当我需要时间间隔非常精确时,有没有比setInterval更好的解决方案?,javascript,web,Javascript,Web,我正在构建一个类似于吉他英雄的浏览器游戏。它的工作方式是设置setInterval,根据节奏,每16个音符执行一次,通常为100-150毫秒。它执行的函数只是检查是否有需要对照用户按键检查的注释 但我一直在读关于setInterval如何受到漂移的影响,可能不是很准确。对于一首持续3-4分钟且需要100毫秒精度的歌曲(如果计时机制稍有偏差,可能会让用户非常沮丧),这似乎不是最好的解决方案 那么有没有更精确的替代方案?T您可以缓存歌曲开头的节拍,获取此后的节拍数,查看该点是否存在音符 返回自197

我正在构建一个类似于吉他英雄的浏览器游戏。它的工作方式是设置setInterval,根据节奏,每16个音符执行一次,通常为100-150毫秒。它执行的函数只是检查是否有需要对照用户按键检查的注释

但我一直在读关于setInterval如何受到漂移的影响,可能不是很准确。对于一首持续3-4分钟且需要100毫秒精度的歌曲(如果计时机制稍有偏差,可能会让用户非常沮丧),这似乎不是最好的解决方案


那么有没有更精确的替代方案?T

您可以缓存歌曲开头的节拍,获取此后的节拍数,查看该点是否存在音符

返回自1970/01/01以来的毫秒数:

var d = new Date();
var n = d.getTime();
n的结果可能是:
150215688172


From:

用绝对时间计算一切可能是更好的主意。所以有一个
var starttime=Date.now(),然后计算每个音符应在哪里
var预期值\u音符\u时间=开始时间+节拍间隔*节拍数
。然后,您可以在按键上添加一个侦听器,然后记录击键的准确时间。如果
abs(按时间-预计时间)
,则将该点添加到用户分数中。祝你好运。

同意,setInterval有一些问题,比如它不关心回调是否仍在运行,也没有那么灵活

您可以实现自己的方法,如下所示:

function interval(func, wait, times){
var interv = function(w, t){
    return function(){
        if(typeof t === "undefined" || t-- > 0){
            setTimeout(interv, w);
            try{
                func.call(null);
            }
            catch(e){
                t = 0;
                throw e.toString();
            }
        }
    };
}(wait, times);

setTimeout(interv, wait);
};
interval(function(){
    // Code block goes here
}, 1000, 10);
该函数有一个名为interv的内部函数,该函数通过setTimeout自动调用,interv内是一个闭包,用于检查重复时间、调用回调并通过setTimeout再次调用interv。如果回调调用中出现异常,则间隔调用将停止并引发异常

您可以这样使用它:

function interval(func, wait, times){
var interv = function(w, t){
    return function(){
        if(typeof t === "undefined" || t-- > 0){
            setTimeout(interv, w);
            try{
                func.call(null);
            }
            catch(e){
                t = 0;
                throw e.toString();
            }
        }
    };
}(wait, times);

setTimeout(interv, wait);
};
interval(function(){
    // Code block goes here
}, 1000, 10);
它以10秒的间隔执行一段代码5次,您可以在其间执行一些操作

需要100毫秒的精度

setInterval()函数将因javascript的构建方式(事件循环)而漂移,如果您用大量CPU密集型任务阻塞它,它将延迟。但是,如果正确执行,漂移将非常小(小于1毫秒)


避免这种情况的一个好方法是使用多线程,但这在JavaScript中不容易实现。

可能会受到漂移的影响
-我以前读过这句话,并决定测试这一说法,发现至少在firefox中,没有漂移,存在抖动。你应该根据用户交互来查询信息,不是setInterval。@PHPglue当用户按下按钮时,我会检查它是否正确。但是,我还需要一种方法来检查用户是否遗漏了一条注释。例如,如果一个用户在整个游戏中没有做任何事情,游戏仍然需要在正确的时间检查每个音符以减少点数。根据日期进行计算。实际上,我已经为检查用户输入设置了精确的解决方案。然而,游戏工作的另一种方式是,即使用户在整个游戏中没有做任何事情,如果用户没有按任何键,游戏仍然需要在正确的时间检查每个音符以减少点数。@AndrewHarris参考此QA-。有了它,你可以使用setInterval和“补偿”任何抖动或漂移。这看起来正是我需要的。谢谢