6

我正在制作一个音乐游戏,当用户按下一个音符时,它会发出声音。当用户按下时,声音自然需要立即播放,以便他们可以判断他们是否与音乐合拍。但是,感觉好像声音滞后了,尤其是当按下音符变得更快时。

我的背景 .m4a 音乐文件是用 AVAudioPlayer 播放的。我选择在 Cocos Denshion 上使用它,因为我可以访问 currentTime 属性。我可能错了,但我不认为我可以使用 CocosDenshion 访问它。

我制作了一个非常短(不到一秒)的 .wav 文件。我在init上预加载了我的音效:

[[SimpleAudioEngine sharedEngine] preloadEffect:@"Assist.wav"];

然后播放音效,在 CCTouchesBegan 中我调用:

[[SimpleAudioEngine sharedEngine] playEffect:@"Assist.wav"];

之后,它调用我的代码来确定用户的时间和奖励积分。知道为什么它可能会滞后,或者是一种更好的方式来与音乐同步播放音效吗?

编辑:我最近尝试了一些事情但没有结果。首先,我尝试在歌曲中出现适当的时间时自动播放声音。仍然有滞后,所以我不认为这是触摸事件缓慢。我还尝试了 3 个不同的声音库。

但是,当我在模拟器中运行时,它似乎并不卡顿。有人有想法吗?我一无所知,这是我无法真正取出的主要功能......

4

3 回答 3

1

您应该避免使用此代码:- [[SimpleAudioEngine sharedEngine] preloadEffect:@"Assist.wav"];

随着应用程序的启动,您应该通过编写以下代码来加载您的框架 SimpleAudioEngine:-

//SimpleAudioEngine *palySound; 在 .h 文件中创建对象。palySound=[SimpleAudioEngine sharedEngine];

每当你想播放声音时,你可以写: [palySound playEffect:@"Assist.wav"];

于 2012-01-09T11:49:26.657 回答
0

你试过芬奇吗?它声称以低延迟播放声音,它也只是 OpenAL 的一个包装器。

除此之外,我真的没有使用 OpenAL 的经验,但可以想到您滞后的两个可能原因:

  1. 主线程太忙 - 尝试将工作从主线程卸载到其他线程。

  2. 也许 OpenAL 定义的缓冲区太大,因此管道将整个声音加载到缓冲区(或其中的一大块)中,然后才开始播放。

于 2012-02-19T21:08:06.580 回答
0

我不确定你在做什么SoundEngine,但根据我自己的经验,不延迟播放声音的最佳方法是AVAudioPlayer为每个声音文件分配一个(除非你想开始弄乱 AudioQueues)。

这是一个例子:

假设AVAudioPlayer *assistPlayer;您当前的视图控制器中有一个。

在你viewDidLoad用你的声音初始化它:

NSURL *wavURL = [[NSBundle mainBundle] URLForResource:@"Assist" withExtension:@"wav"];
assistPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:wavURL error:nil];

然后,在您IBAction要播放文件的位置,只需执行以下操作:

[assistPlayer play];

你不应该有任何滞后。

于 2012-02-17T14:36:42.183 回答