AS3:タイマーイベントを実際の時間に同期させますか?
-
28-09-2019 - |
質問
タイマーイベントを使用して、毎秒(クロックアプリケーション用)発射する予定です。
私は間違っているかもしれませんが、実際のシステム時間に(非常にわずかな)同期の問題がおそらくあると思います。たとえば、タイマーイベントは、実際のシステム時間ミリ秒が0ではなく500になると発射される可能性があります(つまり、秒は部分的に「フェーズ外」になります)。
タイマーイベントをリアルタイムに同期させるか、AS3で2番目のティックが発生したときに何らかのシステム時間イベントを発射する方法はありますか?
また、1000ミリ秒ごとに発射するためにタイマーを設定した場合、アプリケーションの負荷に基づいてオフセットが保証されていますか、それともオフセットがありますか?
これらはおそらくごくわずかな問題ですが、私はただ興味があります。
ありがとう。
解決 2
少なくともタイマーの精度を高める簡単な方法を考えました。タイマー間隔を単に削減するだけで、エラーの最大マージンが減少します。
したがって、タイマーを1000msではなく100msごとに発射するように設定すると、最大エラーは999msではなく99msになります。したがって、必要な精度/パフォーマンスに応じて、これらの値を微調整できます。
代わりに、タイマーの頻度が1秒のままでなければならない場合、非常に速い間隔(〜1ms)で発火する一時的な初期化タイマーを作成できます。次に、各ティックで、現在の時刻と前の時刻を追跡します。時間の数秒が変更された場合(実際のクロックが変更されました)、その瞬間にメインタイマー(1000msで)を発射できます。これにより、リアルタイムの秒が変更されると、1秒のタイマーが開始されます(3桁のミリ秒ではなく、1桁のミリ秒でエラーが発生します)
もちろん、繰り返しになりますが、時間の変更が検出されたときとタイマーが開始されるときから、いくつかの遅れがあります。しかし、少なくとも1秒のタイマーを保持している間、少なくとも精度を高めることができます。
今週はこれを試してみて、報告します。
他のヒント
現在の時間を使用することができます 日にち. 。もし、あんたが 本当 必要なのは、タイマージッターをどの日付を返すかに合わせようとすることで、タイマージッターを制御しようとすることができます。これが問題になるかどうかは確かではありません(確かに、アプリケーションが長期間実行され続けない場合、エラーが速すぎると確信していません)。
OSは通常、数ミリ秒以内にのみ正確であり、そのような精度が必要な場合は何か他のことを行う必要がある場合があることに注意してください。
残念ながら、タイマーが同じレートにとどまることが保証されているとは思わない。一定期間にわたって漂流する可能性が非常に高いです(たとえば、1000msで設定した場合、990msごとに発射する可能性がありますが、これは非常に小さな違いですが、時間の経過とともに合計されます)。あなたが言ったように、100mmごとに発射してから、日付オブジェクトをチェックして、1秒がまだ通過しているかどうかを判断する必要があると思います。