我怎样才能使goog.Timer更准确?

时间:2012-08-05 04:17:11

标签: timer google-closure google-closure-library

我使用goog.Timer创建了一个new goog.Timer(1)对象(http://closure-library.googlecode.com/svn/docs/class_goog_Timer.html),通过监听tick事件每毫秒运行一个函数。但是,该功能似乎每100毫秒运行一次。

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

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

2 个答案:

答案 0 :(得分:2)

Nicholas Zakas在他的博客上写了一篇关于 Timer resolution in browsers 的精彩摘要。正如尼古拉斯指出的那样,HTML5 timers specification(截至2012年8月2日)规定setTimeout()setInterval()的最小间隔为4毫秒。

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

<!doctype html>
<html>
<head>
  <title>goog.Timer Test</title>
  <script src="../closure-library/closure/goog/base.js"></script>
</head>
<body>

<h1>goog.Timer Test</h1>

<div id="mainContent"></div>

<script>
  goog.require('goog.Timer');
</script>
<script>
  var tickCount = 0;
  var timer = new goog.Timer(1);
  var mainDiv = document.querySelector('#mainContent');

  /**
   * Tick callback.
   */
  var tickCounter = function() {
    tickCount++;
    if (tickCount % 1000 === 0) {
      var timeElapsed = goog.now() - startTime;
      mainDiv.innerHTML = 'goog.Timer tick events: ' + tickCount +
          '<br>actual elapsed milliseconds: ' + timeElapsed +
          '<br>milliseconds per goog.Timer tick: ' + timeElapsed/tickCount;
    }
  };

  startTime = goog.now();
  timer.start();
  goog.events.listen(timer, goog.Timer.TICK, tickCounter);
</script>
</body>
</html>

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

答案 1 :(得分:1)

我不知道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);
    }
};

P.S。我刚刚意识到这是一个javascript问题,但到底是什么?试试吧。