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];

那将每秒调用您的方法三十次。


编辑:我四处寻找 CADisplayLink 的分辨率,但找不到太多,所以我自己做了一些测试。

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

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

于 2013-01-19T02:05:30.537 回答