0

iOSでの時間の測定に関して信頼できる解決策を見つけようとしています。時間の経過を1秒の精度で表示したいと思います。iOSに組み込まれているストップウォッチとまったく同じですが、ほんの数秒です。これまでのところ、私が見つけたすべてのソリューションは、NStimerまたはいくつかの愛のレベルCのものの助けを借りてポーリングを使用しているため、不格好に見えます。私が抱えている問題は、「私」が毎回システムに何時かを尋ねる必要があるということです。しかし、不確定なNStimerに依存する必要がある場合、私の測定値は非常に信頼できません。私の時間を更新するシステムから呼び出されたデリゲートメソッドはありませんか?ポーリングの解像度を1nsに上げれば、大丈夫だと思います。しかし、低レベルのCを使用してどのように実装する必要がありますか?

4

2 に答える 2

1

何を目指しているのかわかりません。高解像度の時刻を照会するための良い方法が必要なのか、それともシステムから折り返し電話が必要なのかがわかりません。

前者の場合、これは私が高解像度タイマーに使用するものです。

#import "mach/mach_time.h"

#define TICKS_TO_NANOS(_ticks_, _timebase_) (((_ticks_) * ((_timebase_).numer)) / ((_timebase_).denom))
#define NOW_IN_TICKS() (mach_absolute_time())
#define NOW_IN_NANOS(_timebase_) TICKS_TO_NANOS(NOW_IN_TICKS(), _timebase_)

後者の場合、保証されたコールバックタイマーを取得することはできません。おそらく最も一貫性のあるタイマーコールバックはCADisplayLinkにフックすることですが、グラフィックスメソッドに時間がかかりすぎると、一貫してそれを取得できない場合があります。

システムタイマーを試すことはできますが、そこでも多くの保証は得られません。

于 2012-04-24T23:48:52.850 に答える
1

iOS デバイスは 1 秒あたり 60 回 (最大) しか表示を再描画しないため、それを超える時間の精度はユーザーには見えません。CADisplayLink を使用して、フレーム時間ごとに 1 秒間に 60 回呼び出し、59 回の呼び出しを無視する (から戻る) ことができます。ただし、クロックの 1 つ (複数あります) をポーリングして、表示レートとクロック間のドリフトを確認する必要があります。また、コードが UI 実行ループで長すぎることを行っている場合は、フレームを見逃す可能性があるため、それも確認する必要があります。

于 2012-04-24T23:04:33.980 に答える