如何在ios中获得准确的计时器

时间:2012-03-16 13:10:56

标签: ios nstimer nsrunloop

我正在做一个需要计时器的应用程序。我尝试过NSTimer,但NSTimer总是输了或被推迟了。 iOS SDK中是否有可以准确记录时间的类。精度在20ms到40ms之间是可以的。我希望能够在固定的时间间隔内更改图像。

NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:.04f target:self    selector:@selector(timer1) userInfo:nil repeats:YES];
- (void)timer1
{
   NSLog(@"timer1 timer %@",[NSDate date]);
}

4 个答案:

答案 0 :(得分:4)

NSTimer不是高分辨率计时器。来自NSTimer类文档:

  

由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率限制在50-100毫秒的数量级。

除了@CJ Foley建议的链接外,您还可以查看dispatch_after功能。

答案 1 :(得分:4)

使用CADisplayLink。它以系统帧速率触发:60 fps或17 ms。

如果您想要更长的间隔,可以将其设置为以帧速率的倍数触发,例如每隔2帧或3帧。

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(timer1)];
displayLink.frameInterval = 2;
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

它意味着用于应该更新每个 n 帧的UI。

不要使用dispatch_after。正如名称所暗示的那样,唯一的保证是您的块将在特定时间后执行。如果有什么东西阻塞线程,你的块将不得不等待。

答案 2 :(得分:2)

您是否考虑过使用调度源计时器?从我到目前为止观察到的,这个计时器非常精确。

以下是苹果编程指南之一的链接:

http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html#//apple_ref/doc/uid/TP40008091-CH103-SW1

只需查看子部分:“创建计时器”。

答案 3 :(得分:0)

由于您正在测试NSDate,您的结果可能是假阴性?

This question讨论了如何从NSDate获得毫秒精度。