新しいものを入手することDateTime
は、私にとって十分に正確ではありません。ブラウザの日付オブジェクトは、整数としてミリ秒を提供します。標準の日付オブジェクトよりも正確な時間を取得できるようにしたいと考えています。これは可能ですか?これどうやってするの?
2 に答える
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);
}
時間範囲を測定する場合は、Stopwatch
クラスを使用します。それは普遍的に (クライアントとサーバー上で) 機能し、可能な限り最高の解像度を提供するはずです。
var sw = new Stopwatch()..start();
doSomething();
print(sw.elapsed);
print(sw.elapsedMicroseconds);
window.performance
現在 (2013 年 4 月現在)、ブラウザーのストップウォッチはまだこの機能を使用していませんが、これはバグであり、修正する必要があります。それまでの間、Seth が提案した回避策を使用できます。