iphone上的高分辨率采样率



在我们的应用程序中,我们必须以高分辨率采样。

我看到objective c中正常的NSTimer不能低于50ms。

我们需要以至少1ms的速率采样。

这太奇怪了,当iPhone处理器超过1ghz时,没有一种方法可以在1ms内采样!

我有两个想法:做一个while(1),也许会给我时钟,或者,使用加速度计样本(他是那么快吗?),我肯定两者都不好。

对这个简单的问题有什么想法吗?

实现这种分辨率的精确计时器确实不是一项简单的任务。要获得高度精确的计时器,您可能需要实现自己的run循环。如果它只需要一个计时器,现在动态计时器插入/删除,那么它的实现相当简单。

正如你所说的,运行while(…)循环,在里面你需要睡一段时间。这是最棘手的部分,因为有时之前的实际运行时间可能比实际的大/小,所以你必须补偿它。

    while( running ) {
        gettimeofday(&t_start, NULL);
        {
            double sleep_time = cur_timer->_M->nextFireTime() - elapsedTime;
            if( sleep_time > 0 ) {
                Thread::sleep(sleep_time); //sleep time is in seconds
            }
        }
        gettimeofday(&t_end, NULL);
        elapsedTime += Utils::timeval_diff(t_end, t_start);
        if( running ) {
            gettimeofday(&t_start, NULL);
            {
                //perform all timer callbacks here
            }
            gettimeofday(&t_end, NULL);
        }
        elapsedTime += Utils::timeval_diff(t_end, t_start);
    }

这是我自己的runloop实现的非常简化的版本。这里的主要思想是,您必须跟踪实际运行的时间,并补偿任何时间溢出。

下面是1ms时间步长的输出示例:

period: 0.001000 (0.001000)   elapsed: 0.001160 (0.001160)
period: 0.001000 (0.002000)   elapsed: 0.000988 (0.002148)
period: 0.001000 (0.003000)   elapsed: 0.000982 (0.003130)
period: 0.001000 (0.004000)   elapsed: 0.001003 (0.004133)
period: 0.001000 (0.005000)   elapsed: 0.001004 (0.005137)
.....
period: 0.001000 (4.280872)   elapsed: 0.001022 (4.299592)
period: 0.001000 (4.281872)   elapsed: 0.002627 (4.302219)
period: 0.001000 (4.282872)   elapsed: 0.000018 (4.302237)
period: 0.001000 (4.283872)   elapsed: 0.000266 (4.302503)
period: 0.001000 (4.284872)   elapsed: 0.001091 (4.303594)
period: 0.001000 (4.285872)   elapsed: 0.001026 (4.304620)

要获得更精确的结果,请在具有高优先级的单独线程上运行计时器。

最新更新