以0.03秒重复运行NSTimer - 提高准确性

时间:2013-01-19 01:10:37

标签: objective-c nstimer

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

这需要非常准确。我一直在尝试它,它似乎不时跳过一个节拍。是否有更好的方法每隔0.03秒运行一次方法?

1 个答案:

答案 0 :(得分: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];

这会将你的方法称为每秒三十次。


编辑:我搜索了CADisplayLink的分辨率,但找不到多少,所以我自己做了一些测试。

我修改了一些使用mach_absolute_time()记录帧速率的现有代码,以打印调用我设置为由CADisplayLink调用的方法之间的间隔(以毫秒为单位)。我在CADisplayLink和NSTimer的调用之间进行了几百个时间间隔的测试。 CADisplayLink的平均偏差(从目标时间开始)为十分之三毫秒,而NSTimer的平均偏差为半毫秒。考虑到只有少数精灵渲染到屏幕上,这在准确性上是一个不错的差异。 CADisplayLink准确度提高了40%。

所以,我的结论是,如果你想要一个方法被调用60/n(其中n是整数)每秒一次,那么CADisplayLink就非常优越。您也可以尝试在不同的线程上运行,而不是在进行更少的线程。这也可能会提高通话的准确性。