iPad/iOS 时间问题
iPad/iOS timing problems
最近有人就 iPad 节拍器与我联系,该节拍器在计时方面存在一些相当微妙的问题。我使用过许多 OS X 应用程序,这些应用程序在计时方面没有问题 - 它们非常准确。
他做的小组都是面向UI的东西,我不确定他们是否知道如何在iOS上设置时间。我将从他们那里获取源代码,但我只是想确定- iPad/iOS 是否有时间问题?
计时器的准确性取决于您使用的方法。如果他们使用 NSTimer,它不会像 Apple documentation:
中描述的那样非常准确
Because of the various input sources a typical run loop manages, the
effective resolution of the time interval for a timer is limited to on
the order of 50-100 milliseconds. ... Therefore, the actual time at
which the timer fires potentially can be a significant period of time
after the scheduled firing time.
但是,CADisplayLink 与块回调配对是一种令人难以置信的 准确计时方法。检查他们使用的是哪一个,如果他们使用 NSTimer
.
,则重构为 CADisplayLink
半 Sudo 代码示例(从个人项目中提取):
- (CADisplayLink*)displayLink{
_displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(timerFired:)];
_displayLink.frameInterval = 1;// 1 = Fire every time the frame updates
[_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)timerFired:(CADisplayLink*)displayLink {
for (TTRunLoopCallbackRegistrant *registrant in _timerRegistrants) {
if (registrant.target && registrant.callback) {
registrant.callback();
}
}
}
遗憾的是,CADisplayLink 只能提供整数值,不能提供浮点值。这意味着它不会起作用。我需要看看客户是否希望我继续使用高精度计时器,看看它们是否有效。
最近有人就 iPad 节拍器与我联系,该节拍器在计时方面存在一些相当微妙的问题。我使用过许多 OS X 应用程序,这些应用程序在计时方面没有问题 - 它们非常准确。
他做的小组都是面向UI的东西,我不确定他们是否知道如何在iOS上设置时间。我将从他们那里获取源代码,但我只是想确定- iPad/iOS 是否有时间问题?
计时器的准确性取决于您使用的方法。如果他们使用 NSTimer,它不会像 Apple documentation:
中描述的那样非常准确Because of the various input sources a typical run loop manages, the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds. ... Therefore, the actual time at which the timer fires potentially can be a significant period of time after the scheduled firing time.
但是,CADisplayLink 与块回调配对是一种令人难以置信的 准确计时方法。检查他们使用的是哪一个,如果他们使用 NSTimer
.
CADisplayLink
半 Sudo 代码示例(从个人项目中提取):
- (CADisplayLink*)displayLink{
_displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(timerFired:)];
_displayLink.frameInterval = 1;// 1 = Fire every time the frame updates
[_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)timerFired:(CADisplayLink*)displayLink {
for (TTRunLoopCallbackRegistrant *registrant in _timerRegistrants) {
if (registrant.target && registrant.callback) {
registrant.callback();
}
}
}
遗憾的是,CADisplayLink 只能提供整数值,不能提供浮点值。这意味着它不会起作用。我需要看看客户是否希望我继续使用高精度计时器,看看它们是否有效。