12

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

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

我正在执行以下操作来设置运动更新,以替代我之前使用的加速度计。我确实意识到我可以重建以使用 NSTimer 或其他东西进行自己的投票,并且可能会继续这样做。

[motionManager setDeviceMotionUpdateInterval:updateInterval];
CMDeviceMotionHandler motionHandler = ^(CMDeviceMotion *motion, NSError *error) {
[self processMotion:motion withError:error];
};

[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:motionHandler];

这可行,但更新间隔没有按预期运行。我已经删除了 processMotion 方法中的所有执行代码,除了保存时间戳以查看实际运动更新率是多少。我已经对此进行了足够的测试,以向自己证明它是可重复的,即使是 1/40 的奇怪结果。下表显示了我所看到的:

updateInterval 每秒实际事件数
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 第 4 代 6 上使用 ios 4.2

。我已经尽我所能进行搜索,避风港没有看到解释,尽管我看到一些报告说人们在请求 60hz 时看到 50hz 更新频率,这可能是相关的。

我将尝试的下一件事是为处理设置一个专用队列,而不是使用当前队列,但是我确实想看看这是否是已知行为。我可以理解更新率是否以某种方式受到瓶颈,但不确定为什么它仍然会按比例放大,如果是这样的话。

同样,我想我可以重建以使用 NSTimer 并进行自己的轮询,但我想了解为什么我会看到这个,以防我从根本上误解了 Core Motion 框架。

4

1 回答 1

2

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

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

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

[operationQueue setMaxConcurrentOperationCount:5];

享受。

于 2012-01-19T16:49:31.160 回答