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

obj*_*001 1 objective-c nstimer

        recordingTimer = [NSTimer scheduledTimerWithTimeInterval:0.03
                                                          target:self
                                                        selector:@selector(recordingTimerSelector:)
                                                        userInfo:nil
                                                         repeats:YES];
Run Code Online (Sandbox Code Playgroud)

这需要非常准确.我一直在尝试它,它似乎不时跳过一个节拍.是否有更好的方法每隔0.03秒运行一次方法?

Met*_*ble 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];
Run Code Online (Sandbox Code Playgroud)

那会把你的方法称为每秒三十次.


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

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

因此,我的结论是,如果您希望每秒调用一个方法60/n(其中n是整数),则CADisplayLink非常优越.你也可以尝试在不同的线程上运行,而不是那么多.这也可能提高通话的准确性.