recordingTimer = [NSTimer scheduledTimerWithTimeInterval:0.03
target:self
selector:@selector(recordingTimerSelector:)
userInfo:nil
repeats:YES];
这需要非常准确。我一直在尝试它,它似乎不时跳过一个节拍。是否有更好的方法每隔0.03秒运行一次方法?
答案 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];
这会将你的方法称为每秒三十次。
我修改了一些使用mach_absolute_time()记录帧速率的现有代码,以打印调用我设置为由CADisplayLink调用的方法之间的间隔(以毫秒为单位)。我在CADisplayLink和NSTimer的调用之间进行了几百个时间间隔的测试。 CADisplayLink的平均偏差(从目标时间开始)为十分之三毫秒,而NSTimer的平均偏差为半毫秒。考虑到只有少数精灵渲染到屏幕上,这在准确性上是一个不错的差异。 CADisplayLink准确度提高了40%。
所以,我的结论是,如果你想要一个方法被调用60/n
(其中n
是整数)每秒一次,那么CADisplayLink就非常优越。您也可以尝试在不同的线程上运行,而不是在进行更少的线程。这也可能会提高通话的准确性。