【问题标题】:iOS - Speed IssuesiOS - 速度问题
【发布时间】:2011-05-15 05:36:06
【问题描述】:

大家好,我有一种录制方法,可以将用户播放的音符实时写入数组。唯一的问题是有轻微的延迟,播放时每个序列都明显变慢。我将播放速度提高了大约 6 毫秒,听起来不错,但我想知道延迟是否会在其他设备上有所不同?

我在 ipod touch 2nd gen 上进行了测试,它在 3rd、4th 和 iphone 上表现如何?我需要对所有这些进行测试并找到最佳延迟变化吗?

有什么想法吗?

更多信息: 我使用两个 NSThreads 而不是计时器,并用不应播放音符的空白点填充数组(我使用整数,-1 是空白)。录制时每 0.03 秒添加一个空白。每次用户敲击音符时,最近的空白将被数字 0-7 替换。回放时,使用第二个线程(2 个线程,因为第二个线程的时间间隔更短),时间为 0.024。 6 毫秒的差异补偿了录制和播放之间的延迟。

我假设录制或播放音符的时间比另一个要长,因此会产生延迟。

我想知道的是延迟在其他设备上是否会有所不同,以及我应该如何补偿它。

精确解

我可能没有完全解释它,这就是为什么没有提供这个解决方案,但是对于任何有类似问题的人......

我播放每个节拍类似于这样的 MIDI 文件:

while playing:

do stuff to play beat

new date xyz seconds from now
new date now

while now is not > date xyz seconds from now wait.

我缺少的显而易见的事情是在播放节拍之前创建两个日期......

D'OH!

【问题讨论】:

  • “大家好,我有一种录制方法,可以将用户播放的音符实时写入数组。”您将不得不更清楚地解释这一点。
  • 对不起,主要是我想知道延迟是否会在多个设备上有所不同。我现在将添加更多信息。
  • 您使用什么机制来生成“每 0.03 秒”?你说它不是计时器,那么你如何确定已经过去了适当的时间(自旋循环检查时钟?)
  • 这几乎与苹果的节拍器示例完全相同。
  • NSDate *curtainTime = 日期 + xyz 秒,然后是 NSDate *currentTime = 日期。然后睡眠 xyz 秒,直到 currentTime > 比窗帘

标签: iphone xcode audio delay record


【解决方案1】:

在我看来,额外的延迟更有可能是由音符的播放或第二个线程中的其他计算开销引起的。在播放每个音符之前,在第二个线程中获取挂钟时间,并检查与上一个音符的时间差。您需要将后续延迟减少任何多余的时间(可能是 0.006 秒!)。

不同代的iphone延迟会有所不同,但是像这样动态适应,只要处理开销小于0.03秒就安全了。

你也应该在第一个线程中做同样的事情。


获取高分辨率时间戳 - 苹果论坛上有一个讨论here,或者这个stackoverflow question.

【讨论】:

  • 是的。检查并纠正,而不是硬编码一个几乎可以保证在下一代硬件/操作系统上不正确的值。
  • 通过什么检查挂钟? NSD 日期?
猜你喜欢
  • 2011-12-09
  • 1970-01-01
  • 2022-01-22
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多