Timer 我怎样才能使计时器更精确?

Timer 我怎样才能使计时器更精确?,timer,google-closure,google-closure-library,Timer,Google Closure,Google Closure Library,我用new goog.Timer(1)制作了一个goog.Timer对象(),通过监听滴答声事件,每毫秒运行一次函数。但是,该函数似乎每100毫秒运行一次 我假设我的函数需要一段时间才能运行(当然javascript是单线程的),所以需要一段时间才能进入下一轮。因此,我将计时器的间隔设置为100,并且它每1/10秒可靠地运行一次 Google Closure库是否有一个更可靠的计时器,它只以精确的间隔运行函数?如果没有足够的时间在一个周期内运行一个函数,我可以取消上一个调用,并在下一次调度tic

我用
new goog.Timer(1)
制作了一个
goog.Timer
对象(),通过监听滴答声事件,每毫秒运行一次函数。但是,该函数似乎每100毫秒运行一次

我假设我的函数需要一段时间才能运行(当然javascript是单线程的),所以需要一段时间才能进入下一轮。因此,我将计时器的间隔设置为100,并且它每1/10秒可靠地运行一次


Google Closure库是否有一个更可靠的计时器,它只以精确的间隔运行函数?如果没有足够的时间在一个周期内运行一个函数,我可以取消上一个调用,并在下一次调度tick时运行它

我不知道goog定时器,但这在我的模拟器中起作用。但在我告诉它3毫秒后它停止了

public Timer gameTimer;
int i = 1;
TextView TVsource;//You still have to assign this to a layout view in onCreate

public void runTimer() {

    gameTimer = new Timer();
    gameTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            if (i < 5000) {
                TimerMethod();
            }
        }
    }, 1000, 1);
}

public void TimerMethod() {
    this.runOnUiThread(Timer_Tick);
}

private Runnable Timer_Tick = new Runnable() {
    public void run() {
        i++;
        TVsource.setText("its " + i);
    }
};
公共计时器游戏计时器;
int i=1;
TextView电视源//您仍然必须在onCreate中将其指定给布局视图
公共无效运行计时器(){
gameTimer=新计时器();
gameTimer.schedule(新的TimerTask(){
@凌驾
公开募捐{
如果(i<5000){
TimerMethod();
}
}
}, 1000, 1);
}
公共无效时间方法(){
此.runOnUiThread(计时器滴答声);
}
私有可运行计时器\u Tick=new Runnable(){
公开募捐{
i++;
TVsource.setText(“its”+i);
}
};

另外,我刚刚意识到这是一个javascript问题,但到底是什么?试试看。

尼古拉斯·扎卡斯(Nicholas Zakas)在他的博客上写了一篇很好的摘要。正如尼古拉斯指出的那样,(截至2012年8月2日)规定
setTimeout()
setInterval()
的最小间隔为4毫秒

我编写了以下演示应用程序来测试
goog.Timer
的最小间隔延迟


计时器测试
计时器测试
goog.require(“goog.Timer”);
var-tickCount=0;
var定时器=新的goog.定时器(1);
var mainDiv=document.querySelector(“#mainContent”);
/**
*勾选回调。
*/
var tickCounter=函数(){
tickCount++;
如果(滴答数%1000==0){
var timeappeased=goog.now()-startTime;
mainDiv.innerHTML='goog.Timer tick events:'+tickCount+
“
实际已用毫秒数:”+已用时间+ “
毫秒/滴答计时器滴答:”+timepassed/tickCount; } }; startTime=goog.now(); timer.start(); goog.events.listen(timer,goog.timer.TICK,tickCounter);

在Chrome版本21中运行此程序时,每个
goog.Timer
勾选事件始终显示大约4.2毫秒,这非常接近允许的最小浏览器计时器分辨率4毫秒。

goog.Timer
包装本机
setInterval
,它本身可能不够快,无法在1毫秒内运行您的函数。您确定需要这么大的粒度吗?1ms的投票是残酷的。您不能使用
goog.events.listen
dispatchEvent
?谢谢,我不需要1ms的粒度。20-100毫秒就好了。