1
        recordingTimer = [NSTimer scheduledTimerWithTimeInterval:0.03
                                                          target:self
                                                        selector:@selector(recordingTimerSelector:)
                                                        userInfo:nil
                                                         repeats:YES];

これは非常に正確である必要があります。私はそれを実験してきました、そしてそれは時々ビートをスキップするようです。0.03秒ごとにメソッドを実行するためのより良い方法はありますか?

4

1 に答える 1

6

NSTimerの解像度は50〜100ミリ秒、つまり0.05〜0.1秒です。CADisplayLinkを試すことができます。

CADisplayLink* link = [CADisplayLink displayLinkWithTarget:self selector:@selector(doSomething)];
        link.frameInterval = 2;//thirty times a second
        [link addToRunLoop:[NSRunLoop mainRunLoop]
                         forMode:NSDefaultRunLoopMode];

これにより、メソッドが1秒間に30回呼び出されます。


編集:CADisplayLinkの解像度を検索しましたが、あまり見つかりませんでした。そのため、自分でテストを行いました。

mach_absolute_time()を使用してフレームレートをログに記録する既存のコードを変更して、CADisplayLinkによって呼び出されるように設定したメソッドの呼び出し間の間隔をミリ秒単位で出力しました。CADisplayLinkとNSTimerの両方の呼び出しの間に数百の時間間隔でテストを行いました。CADisplayLinkの平均偏差(目標時間からの)は10分の3ミリ秒でしたが、NSTimerの平均偏差は0.5ミリ秒でした。少数のスプライトだけが画面にレンダリングされていることを考えると、これは精度のかなりの違いです。CADisplayLinkは40%正確でした。

したがって、私の結論は、メソッドを1秒間に60/nn整数である)回数呼び出す場合は、CADisplayLinkの方がはるかに優れているということです。あまり進んでいない別のスレッドで実行してみることもできます。これにより、通話の精度も向上する可能性があります。

于 2013-01-19T02:05:30.537 に答える