2

ティックイベントをリッスンしてミリ秒ごとに関数を実行するオブジェクトgoog.Timerhttp://closure-library.googlecode.com/svn/docs/class_goog_Timer.html)を作成しました。new goog.Timer(1)ただし、関数は代わりに100ミリ秒ごとに実行されているように見えました。

私は自分の関数の実行に時間がかかっていると仮定しました(そしてもちろんjavascriptはシングルスレッドです)ので、次のラウンドに進むのに時間がかかりました。したがって、タイマーの間隔を100に設定すると、1/10秒ごとに確実に実行されました。

Google Closureライブラリには、間隔で正確に関数を実行するだけの、より信頼性の高いタイマーがありますか?1サイクルで関数を実行するのに十分な時間がない場合は、前の呼び出しをキャンセルして、次にティックがディスパッチされたときに実行しても問題ありません。

4

2 に答える 2

2

Nicholas Zakasは、彼のブログにブラウザでのタイマー解決の素晴らしい要約を書いています。Nicholasが指摘したように、HTML5タイマーの仕様setTimeout()(2012年8月2日現在)では、およびの最小間隔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でこのプログラムを実行すると、ティックイベントごとに約4.2ミリ秒が一貫して表示されますgoog.Timer。これは、ブラウザの最小許容タイマー解像度である4ミリ秒に非常に近い値です。

于 2012-08-05T05:38:51.617 に答える
1

私はグーグタイマーについて知りませんが、これは私のエミュレーターで機能しました。と言ってから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);
    }
};

PSこれはJavaScriptの質問だと気づきましたが、一体何なのでしょう?それを試してみてください。

于 2012-08-05T04:47:18.953 に答える