你在iPhone游戏中用什么来播放声音?

时间:2009-06-12 14:38:10

标签: iphone performance audio avaudioplayer finch

我有一个性能密集的iPhone游戏,我想添加声音。似乎有三个主要选择:(1)AVAudioPlayer,(2)音频队列和(3)OpenAL。我不想只是为了播放一个样本来编写低级代码页面,所以我想使用AVAudioPlayer。问题在于它似乎会破坏性能 - 我使用CFAbsoluteTimeGetCurrent进行了简单的测量,play消息似乎需要9到30毫秒才能完成。考虑到25 ms == 40 fps,那真是太悲惨了。

当然有prepareToPlay方法可以加快速度。这就是为什么我写了一个简单的类,它可以保留几个AVAudioPlayer,预先准备它们,然后使用准备好的播放器播放样本。没有雪茄,仍然需要上面提到的约20毫秒。

这样的性能对于游戏来说是无法使用的,那么你用什么方法在iPhone上播放性能不错的声音呢?我在AVAudioPlayer做错了吗?你用音频队列播放声音吗? (在2.2出现之前,我写了一些类似于AVAudioPlayer的内容,我很乐意放弃这种体验。)你使用OpenAL吗?如果是,是否有简单的方式用OpenAL播放声音,或者您是否必须编写代码页?


更新:是的,使用OpenAL播放声音为fairly simple


5 个答案:

答案 0 :(得分:8)

AVAudioPlayer在游戏音频方面非常有优势。通过调整其中一个示例来解决AudioQueue或OpenAL绝对是可行的方法。这种延迟更容易控制。

答案 1 :(得分:7)

如果您在主线程上调用play,请尝试在单独的线程上运行它。我最终做的是:

#include <dispatch/dispatch.h>

dispatch_queue_t playQueue = dispatch_queue_create("com.example.playqueue", NULL);

AVAudioPlayer* player = ...
dispatch_async(playQueue, ^{
    [player play];
});

它解决了我遇到的帧率最低的口吃问题。

答案 2 :(得分:2)

我使用OpenAL和CrashLanding示例代码附带的类。到目前为止,它可以同时播放样本并播放循环播放的音乐。我正在学习如何释放我为声音(.wav文件)分配的内存,例如,我只想播放一些介绍音乐。

答案 3 :(得分:2)

使用CocosDenshion - 免费,简单且有效。它包含AVAudioPlayer用于背景音轨和OpenAL用于声音。

答案 4 :(得分:0)

您想要使用您正在使用的实现来检查缓冲吗?它可能与您遇到的20ms延迟有某种关系。即尝试使用缓冲区大小。