2012-08-05 75 views
2

我做了一個goog.Timer對象(http://closure-library.googlecode.com/svn/docs/class_goog_Timer.html)與new goog.Timer(1)通過監聽tick事件每毫秒運行一個函數。但是,函數似乎每100毫秒運行一次。如何讓goog.Timer更精確?

我假設我的功能需要一段時間才能運行(當然,javascript是單線程的),所以花了一段時間才能進入下一輪。因此,我將計時器的間隔設置爲100,並且每1/10秒可靠運行一次。

Google Closure庫有一個更可靠的計時器,它只能在間隔時間內精確運行一個函數嗎?如果沒有足夠的時間在一個週期內運行某個函數,那麼在取消前一個調用並在下一次調度時運行它就可以了。

+0

'goog.Timer'包裝原生'setInterval',它本身可能不夠快,無法在1 ms內運行你的函數。你確定你需要那麼多粒度嗎? 1ms輪詢是殘酷的。你不能使用'goog.events.listen'和'dispatchEvent'? – hyperslug 2012-08-05 05:15:14

+1

謝謝,我不需要1ms的粒度。 20-100ms會很好。 – dangerChihuahua007 2012-08-05 05:16:54

回答

2

尼古拉斯Zakas在他的博客中寫道起來Timer resolution in browsers一個很好的總結。正如Nicholas指出的那樣,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毫秒的最小允許瀏覽器計時器的分辨率大約4.2毫秒。

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問題,但到底是什麼?嘗試一下。