【发布时间】:2010-11-02 11:40:21
【问题描述】:
我有一款性能密集型 iPhone 游戏,我想为其添加声音。似乎有大约三个主要选择:(1)AVAudioPlayer,(2)音频队列和(3)OpenAL。我讨厌写几页低级代码只是为了播放示例,所以我想使用AVAudioPlayer。问题是它似乎扼杀了性能——我使用CFAbsoluteTimeGetCurrent 做了一个简单的测量,play 消息似乎需要 9 到 30 毫秒才能完成。考虑到 25 ms == 40 fps,这真是太悲惨了。
当然有prepareToPlay 方法可以加快速度。这就是为什么我编写了一个简单的类,它保留了几个 AVAudioPlayers 供其使用,预先准备好它们,然后使用准备好的播放器播放样本。没有雪茄,仍然需要我上面提到的大约 20 毫秒。
这样的性能在游戏中是无法使用的,那么你用什么来在 iPhone 上播放性能不错的声音呢?我对AVAudioPlayer 做错了吗?您是否使用音频队列播放声音? (在 2.2 发布之前,我已经写过类似于 AVAudioPlayer 的东西,我很乐意保留这种经验。)你使用 OpenAL 吗?如果是,是否有一种简单的方式来使用 OpenAL 播放声音,或者您是否必须编写代码页?
更新:是的,使用 OpenAL 播放声音是 fairly simple。
【问题讨论】:
-
Finch 使用什么声音格式?我尝试了一个 16 位、44.1kHz、PCM(未压缩)的 .caf 文件,播放声音时发出嘶嘶声。
-
事实证明 OpenAL 需要 little-endian 数据。我使用的转换器应用程序,只保存大端。切换到 afconvert 直到我可以编写拖放转换器。
-
是 finch 缓冲音频文件还是我们应该明确缓冲它。
-
整个音频缓冲区在播放前被发送到 OpenAL,所以我认为在调用端进行缓冲没有什么意义。
-
你确定你的意思不是~200毫秒吗? 20 毫秒是一个非常短的时间,当然对于游戏声音来说已经足够了......
标签: iphone performance audio avaudioplayer finch