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

zou*_*oul 28 iphone audio performance avaudioplayer finch

我有一个性能密集的iPhone游戏,我想添加声音.似乎有三个主要选择:(1)AVAudioPlayer,(2)音频队列和(3)OpenAL.我讨厌编写低级代码页面来播放样本,所以我想使用它AVAudioPlayer.问题是它似乎杀死了性能 - 我做了一个简单的测量使用CFAbsoluteTimeGetCurrent,play消息似乎需要9到30毫秒才能完成.考虑到25毫秒== 40 fps,这非常悲惨.

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

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


更新:是的,使用OpenAL播放声音非常简单.


Mar*_*sey 8

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

  • 嗨我是2018年,如果反复调用'play`或`setCurrentTime:0`,`AVAudioPlayer`仍会降低帧率.`dispatch_async`没有帮助.`.caf`扩展也无济于事. (3认同)

Rya*_*yan 7

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

#include <dispatch/dispatch.h>

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

AVAudioPlayer* player = ...
dispatch_async(playQueue, ^{
    [player play];
});
Run Code Online (Sandbox Code Playgroud)

这解决了我遇到的最糟糕的帧率口吃问题.