ken*_*der 3 iphone cocoa timing
我正在努力在iPhone上创建一个简单的节拍器.该应用程序现在所做的是运行计时器,每1/1000秒输入计时器的功能.然后它检查当前时间与启动应用程序的时间(我正在使用CACurrentMediaTime()功能).
CFTimeInterval currentTime = CACurrentMediaTime();
if (self.beatingStartTime == 0) {
self.beatingStartTime = currentTime;
}
if ( (currentTime - self.beatingStartTime) >= self.timeIntevalBetweenTicks * self.internalTimerCounter ) {
self.internalTimerCounter ++;
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果有一个播放音频的好时机,使用OpenAL播放它的代码会被触发.
基本就是这样.我检查了在模拟器和2个设备(iPad和越狱的iPhone 3GS)上运行时播放的声音,并且有一个问题 - 当我录制声音并在Reaper软件中查看波形时,有些声音播放时间太晚了,其中一些 - 有点太早了(即使我能理解"太晚了"的部分,我真的不知道它应该如何才能发挥它应该 - 因为应用程序每次检查秒数,它基本上不能比我指定的时间更早 - 但根据我的记录,它是.
与此同时,有一些节拍器应用程序在定时方面以"坚如磐石"着称,所以我猜有一种方法.我只是想知道我错过了什么......
编辑:将定时器调用从1/1000秒更改为例如1/100并没有帮助.
编辑2:当我从计时器切换到线程(并且我让线程在指定时间内休眠)时,我仍然会遇到奇怪的行为.节奏四处移动,虽然我可以理解一点滞后并且播放一些声音太晚,问题是它们中的一些确实发挥得太早 - 这意味着2节拍之间的时间距离应该超过应该通过的时间.
差异大约是3%,相当于大约10-15毫秒,这对我来说非常重要.任何人都知道为什么声音可以更早播放?我在iPhone模拟器和iPad实际设备上都尝试过这种方法,而我唯一的猜测是计时器出现了问题 - CACurrentMediaTime()它应该返回更多的秒数.它甚至可能吗?
尝试使用NSSound,并将其作为实例变量加载,除非您的节拍器没有运行,否则不要释放它.通过将文件加载到循环内存中可能导致延迟.另一件需要考虑的事情是节拍器可能不需要每1/1000秒轮询一次.如果你不经常这样做,你就不太可能让CPU饱和,你可能会得到更一致的结果.
最后,看看Apple的演示如何工作:http://developer.apple.com/library/ios/#samplecode/Metronome/Introduction/Intro.html
可能会让你更好地了解如何完成你想要做的事:)