Iphone 设备运动更新的实际频率低于预期,但随着设置的增加而增加

Iphone 设备运动更新的实际频率低于预期,但随着设置的增加而增加,iphone,cocoa-touch,intervals,core-motion,Iphone,Cocoa Touch,Intervals,Core Motion,我正在移植一个我最初使用iOS3加速计编写的应用程序,以整合新的iOS4运动功能 在捕捉运动时,应用程序几乎不做其他事情——例如,没有图形更新 我正在做以下工作来设置运动更新,以替代我以前使用的加速计。我确实意识到,我可以使用NSTimer或其他工具重新构建自己的轮询,并且可能会继续这样做 [motionManager setDeviceMotionUpdateInterval:updateInterval] CMDeviceMotionHandler motionHandler=^(CMDe

我正在移植一个我最初使用iOS3加速计编写的应用程序,以整合新的iOS4运动功能

在捕捉运动时,应用程序几乎不做其他事情——例如,没有图形更新

我正在做以下工作来设置运动更新,以替代我以前使用的加速计。我确实意识到,我可以使用NSTimer或其他工具重新构建自己的轮询,并且可能会继续这样做


[motionManager setDeviceMotionUpdateInterval:updateInterval]
CMDeviceMotionHandler motionHandler=^(CMDeviceMotion*运动,N错误*错误){
[自处理运动:运动错误:错误];
};

[motionManager StartDeviceMotionUpdate至队列:[NSOperationQueue currentQueue]和处理程序:motionHandler];
这是可行的,但更新间隔的行为与预期不符。我已经剥离了processMotion方法中的所有执行代码,除了保存时间戳以查看实际的运动更新率。我已经做了足够多的测试来证明它是可重复的,即使是1/40的奇怪结果。下表显示了我看到的情况:

updateInterval actual events per second 1.0/20.0 13 1.0/30.0 27 1.0/40.0 27 1.0/50.0 34 1.0/60.0 40 1.0/70.0 57 1.0/90.0 60 1.0/100.0 74 每秒更新间隔实际事件数 1.0/20.0 13 1.0/30.0 27 1.0/40.0 27 1.0/50.0 34 1.0/60.0 40 1.0/70.0 57 1.0/90.0 60 1.0/100.0 74 一些注释:
1.我确信更新间隔设置正确,并在设置后进行了检查以确认

2.我确信我正在跟踪processMotion的每个调用,没有使用nil CMDeviceMotion或其他奇怪的调用

3.我没有做任何有意义的处理来阻止事情,只是等待运动事件并记录它们。作为加速计的代表,这一切都非常好

4.运动数据很好,只是更新频率太低:)

5.这是在第四代ipod touch上使用ios 4.2

6.我已经尽我所能搜索了,没有看到任何解释,尽管我看到一些报告说,人们在请求60hz时看到50hz的更新频率,这可能与此有关。

我将尝试的下一件事是为处理设置一个专用队列,而不是使用当前队列,但是我确实想看看这是否是一个已知的行为。我可以理解更新率是否受到了某种程度的限制,但不确定如果是这样的话,为什么它还会像图中所示那样扩大。


同样,我想我可以重新构建以使用NSTimer并进行我自己的轮询,但我想了解为什么我会看到这一点,以防我从根本上误解了核心运动框架。

好的,这里有一个可能的解决方案:

NSOperationQueue
上的并发操作数由操作系统决定。这意味着有时一次可以进行很少甚至一次操作

您可以显式地将操作数设置为某个合理的数目,例如

[operationQueue setMaxConcurrentOperationCount:5];

享受。

这正是我在iPhone4上通过类似方法发现的。似乎CoreMotion中仍然存在一些bug。感谢您的提醒,如果时间戳显示速率与预期一致,也许我会使用1/90并更改为1/60。。。dirty hack虽然只是一个快速更新,但我切换到了由NSTimer驱动的轮询,结果通常更好,但有时我会连续两次获得相同的样本值。将继续试验。4天前未收到您的答复。可能是赛车条件的问题,如果计时器比核心运动快,特别是当核心运动没有按预期交付事件时。是的,但这是相当罕见的,因为我总是可以检查时间戳,事情对我来说没问题。很有意思,看看这是否会在未来有所改善,或者新的信息是否会曝光。非常有意思。我很久以前就离开了那个项目,手头没有一个可以快速测试的开发环境,但人们似乎时不时地检查一下。如果有两个人想确认这一点,我会接受的,否则我将不得不等到我有时间自己设置一个测试。嘿,J.Spiral,我的回答有帮助吗?你从未回应过。:)对不起,我花了很长时间才回到这件事上!