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

Objective c 以0.03秒重复运行NSTimer-提高准确性,objective-c,nstimer,Objective C,Nstimer,这需要非常准确。我一直在用它做实验,它似乎时不时地跳过一个节拍。是否有更好的方法每0.03秒运行一次方法?n计时器的分辨率为50到100毫秒,或0.05到0.1秒。你可以试试CADisplayLink recordingTimer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self

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

n计时器的分辨率为50到100毫秒,或0.05到0.1秒。你可以试试CADisplayLink

        recordingTimer = [NSTimer scheduledTimerWithTimeInterval:0.03
                                                          target:self
                                                        selector:@selector(recordingTimerSelector:)
                                                        userInfo:nil
                                                         repeats:YES];
这会每秒调用你的方法三十次


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

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


因此,我的结论是,如果您希望一个方法每秒被调用
60/n
(其中
n
是一个整数)次,那么CADisplayLink的优越性非常大。您也可以尝试在另一个线程上运行,但运行的线程较少。这也可能会提高调用的准确性。

NSTimer的分辨率为50到100毫秒,或0.05到0.1秒。你可以试试CADisplayLink

        recordingTimer = [NSTimer scheduledTimerWithTimeInterval:0.03
                                                          target:self
                                                        selector:@selector(recordingTimerSelector:)
                                                        userInfo:nil
                                                         repeats:YES];
这会每秒调用你的方法三十次


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

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



因此,我的结论是,如果您希望一个方法每秒被调用
60/n
(其中
n
是一个整数)次,那么CADisplayLink的优越性非常大。您也可以尝试在另一个线程上运行,但运行的线程较少。这也可能会提高通话的准确性。

调度计时器可能工作得更好,但老实说,在这种分辨率下,你不能指望它是完美的。你的目标设备是什么?iPhone和Mac。它的读取帧速率(30FPS=.03秒)。有没有一种有效的方法来计算时间帧速率?你能告诉我们你具体在做什么,以便我们能给你一个更好的解决方案(如果可能的话)?嗯,我基本上是在做一个“录音机”应用程序。它读取一些数据,并以30FPS的分辨率(每.03秒1次)将这些数据作为元素保存到XML文件中。当我按下“停止”键时,计时器停止,我保存XML文件;[timecode setStringValue:[NSString stringWithFormat:@“%@、%@、%@、%@、%@、%@、[DMXChannelArray objectAtIndex:0]、[DMXChannelArray objectAtIndex:1]、[DMXChannelArray objectAtIndex:2]、[DMXChannelArray objectAtIndex:3]、[DMXChannelArray objectAtIndex:4];[根addChild:timecode];调度计时器可能工作得更好,但老实说,在这种分辨率下,你不能期望它是完美的。你的目标设备是什么?iPhone和Mac。它的读取帧速率(30FPS=.03秒)。有没有一种有效的方法来计算时间帧速率?你能告诉我们你具体在做什么,以便我们能给你一个更好的解决方案(如果可能的话)?嗯,我基本上是在做一个“录音机”应用程序。它读取一些数据,并以30FPS的分辨率(每.03秒1次)将这些数据作为元素保存到XML文件中。当我按下“停止”键时,计时器停止,我保存XML文件;[timecode setStringValue:[NSString stringWithFormat:@“%@、%@、%@、%@、%@、%@、[DMXChannelArray objectAtIndex:0]、[DMXChannelArray objectAtIndex:1]、[DMXChannelArray objectAtIndex:2]、[DMXChannelArray objectAtIndex:3]、[DMXChannelArray objectAtIndex:4];[根addChild:timecode];您需要链接到QuartzCore并导入
QuartzCore/CADisplayLink.h
。太棒了!CADisplayLink的分辨率是多少?我假设,因为它已经在帧中工作了,所以它会更精确?哇!谢谢你给我额外的时间。我正在努力让代码正常工作。我添加了QuartzCore框架和#import,但它显示了一个错误,表示找不到它。我做错了什么?@ObjectiveCoder001很抱歉,我没有注意到你的评论说你也需要Mac解决方案。您可以尝试使用
CVDisplayLink
,它本质上是一种与Mac等效的软件。它与显示器的刷新率有关,就像
CADisplayLink
与iPhone屏幕的刷新率(每秒60次)有关。我不认为你能保证它会以每秒30次的速度运行。其他选项包括基于Grand Central dispatch(中央调度)的调度计时器,或使用
mach\u wait\u until(马赫等待)或其他高精度定时功能定制的调度计时器:/令人惊叹的好的,再次谢谢你。我将研究这些选项。我在我的iPhone应用程序版本中使用了CADisplayLink,它绝对棒极了。刚刚在我的mac上使用了CVDisplayLink,但速度是60帧/秒。我可能只是创建一些代码,每隔60fps调用刷新方法时调用另一个方法。您需要链接到QuartzCore并导入
QuartzCore/CADisplayLink.h
。太棒了!原因是什么