6

新しいものを入手することDateTimeは、私にとって十分に正確ではありません。ブラウザの日付オブジェクトは、整数としてミリ秒を提供します。標準の日付オブジェクトよりも正確な時間を取得できるようにしたいと考えています。これは可能ですか?これどうやってするの?

4

2 に答える 2

6

window.performance.now()単調で高解像度の時間を取得するために使用します。このnow()関数は、小数部にマイクロ秒を含む double を返します。

次に例を示します。

import 'dart:html';

main() {
  var time = window.performance.now();
  print(time); // 12123.24341221
}

now()典型的な「エポックからの時間」ではないことに注意してください。代わりに、 からのデルタですwindow.performance.timing.navigationStart

フィールドは次のnavigationStartように定義されます (仕様から):

この属性は、ユーザー エージェントが前のドキュメントのアンロードを求めるプロンプトを終了した直後の時間を返さなければなりません。前のドキュメントがない場合、この属性は fetchStart と同じ値を返す必要があります。

タイムスタンプは、window.performance.now()クロック スキューの影響を受けず、新しい を取得するよりも正確であるため、優れていDateTimeます。

あなたのアプリケーションがrequestAnimationFrame(そうでなければ、なぜでしょうか? :) によって動かされているなら、あなたはすでに高解像度のタイムスタンプを持っています!

によって返される Future はanimationFrame、高解像度のタイムスタンプで完了します。

Future<num> animationFrame;

次のように使用できます。

gameLoop(num highResolutionTime) {
  // stuff
  window.animationFrame.then(gameLoop);
}

main() {
  window.animationFrame.then(gameLoop);
}
于 2013-04-01T05:22:38.147 に答える
5

時間範囲を測定する場合は、Stopwatchクラスを使用します。それは普遍的に (クライアントとサーバー上で) 機能し、可能な限り最高の解像度を提供するはずです。

var sw = new Stopwatch()..start();
doSomething();
print(sw.elapsed);
print(sw.elapsedMicroseconds);

window.performance現在 (2013 年 4 月現在)、ブラウザーのストップウォッチはまだこの機能を使用していませんが、これはバグであり、修正する必要があります。それまでの間、Seth が提案した回避策を使用できます。

于 2013-04-01T12:37:55.880 に答える