28

我有一个性能密集型的 iPhone 游戏,我想添加声音。似乎有大约三个主要选择:(1)AVAudioPlayer,(2)音频队列和(3)OpenAL。我讨厌写几页低级代码只是为了播放示例,所以我想使用AVAudioPlayer. 问题是它似乎扼杀了性能——我已经做了一个简单的测量CFAbsoluteTimeGetCurrentplay消息似乎需要 9 到 30 毫秒才能完成。考虑到 25 ms == 40 fps,这非常悲惨。

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

这样的性能对于游戏来说是无法使用的,那么你用什么来在 iPhone 上播放性能不错的声音呢?我做错了AVAudioPlayer什么吗?您是否使用音频队列播放声音?(在 2.2 发布之前,我已经写过类似于 AVAudioPlayer 的东西,我很乐意保留这种经验。)你使用 OpenAL 吗?如果是,是否有一种简单的方法可以使用 OpenAL 播放声音,或者您是否必须编写代码页?


更新:是的,用 OpenAL 播放声音相当简单


4

5 回答 5

8

AVAudioPlayer 对于游戏音频来说是非常边缘化的。通过调整其中一个示例来处理 AudioQueue 或 OpenAL 绝对是要走的路。这种方式的延迟更加可控。

于 2009-06-15T00:17:32.413 回答
7

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

#include <dispatch/dispatch.h>

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

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

这解决了我遇到的最糟糕的帧速率卡顿问题。

于 2012-06-21T18:43:00.733 回答
2

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

于 2009-06-13T04:38:48.527 回答
2

使用CocosDenshion – 它免费、简单且有效。它AVAudioPlayer为背景音轨包装,为声音包装 OpenAL。

于 2009-08-29T01:35:19.020 回答
0

你想用你正在使用的实现检查缓冲吗?这可能与您遇到的 20 毫秒延迟有关。即,尝试使用缓冲区大小。

于 2009-06-12T14:42:39.770 回答