用于 CoreMotion 和准确计时目的的 NSThread、NSOperation 或 GCD?

Posted

技术标签:

【中文标题】用于 CoreMotion 和准确计时目的的 NSThread、NSOperation 或 GCD?【英文标题】:NSThread, NSOperation or GCD for CoreMotion and accurate timing purposes? 【发布时间】:2012-01-24 14:44:01 【问题描述】:

我希望在 iPhone 4+ 上进行一些高精度的核心运动读数(如果可能,则 >=100Hz)和运动分析,这将在应用程序的主要部分持续运行。运动响应和分析代码发出的信号必须尽可能没有延迟。

我最初的计划是根据此处引用的节拍器项目中的代码启动一个专用的 NSThread:Accurate timing in ios,以及用于链接和使用该线程的运动分析器的协议。我想知道 GCD 或 NSOperation 队列是否会更好?

大量阅读后我的印象是,它们旨在处理大量离散的一次性操作,而不是定期重复执行的少量操作,并且每毫秒左右使用它们可能会无意中创建大量线程创建/销毁开销。有人在这里有经验吗?

我还想知道线程中无限 while 循环对性能的影响(例如上面链接中的代码)。有谁知道更多关于线程如何在引擎盖下工作的信息?我知道 iPhone4(及以下)是单核处理器并使用某种智能多任务处理(抢先式?),它根据各种时序和 I/O 需求切换线程以创建并行效果......

如果你的线程有一个简单的“while”循环无限运行,但每毫秒左右只做任何额外的工作,处理器的切换算法是否认为无限循环是对资源的“高需求”,从而占用其他资源线程还是足够聪明地在额外代码执行之间的“停机时间”中将资源更多地分配给其他线程?

提前感谢您的帮助和专业知识...

【问题讨论】:

【参考方案1】:

IMO 的瓶颈是传感器。实际更新频率通常不等于您指定的频率。见update frequency set for deviceMotionUpdateInterval it's the actual frequency?和Actual frequency of device motion updates lower than expected, but scales up with setting

前段时间,我使用 Core Motion 和原始传感器数据进行了几次测量。我也需要高更新率,因为我正在进行 Simpson 集成,因此需要尽量减少错误。事实证明,实际频率总是较低,并且在 80 Hz 左右存在限制。这是一部运行 iOS 4 的 iPhone 4。但只要您在大多数情况下不需要将其用于科学目的,无论如何 60-70 Hz 都应该满足您的需求。

【讨论】:

谢谢。这些链接有一些有用的信息,例如 CoreMotion 在单独的线程上进行额外的计算以获取姿态坐标。如果有人知道的话,我仍然想更多地了解这个问题的一般线程方面......

以上是关于用于 CoreMotion 和准确计时目的的 NSThread、NSOperation 或 GCD?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:Core Motion 用于检测远距离较大的运动?

使用 AudioUnit 的精确计时器

使用 Core Motion 准确跟踪用户围绕对象旋转的度数

制作计时器:threading.Event.wait 的超时不准确 - Python 3.6

使用计时器实现图片的准确缩放

如何在javascript中创建一个准确的计时器?