我正在制作音乐游戏,当用户按下音符时,它会发出声音。当用户按下时,声音自然需要立即播放,因此他们可以判断它们是否与音乐同步。然而,感觉好像声音是滞后的,特别是当音符按下变得更快时。
我的背景.m4a音乐文件与AVAudioPlayer一起播放。我选择在Cocos Denshion上使用它,因为我可以访问currentTime属性。我可能错了,但我不认为我可以使用CocosDenshion访问它。
我制作的.wav文件非常短(不到一秒钟)。我在init上预加载我的声音效果:
[[SimpleAudioEngine sharedEngine] preloadEffect:@"Assist.wav"];
然后播放音效,在CCTouchesBegan中我打电话:
[[SimpleAudioEngine sharedEngine] playEffect:@"Assist.wav"];
之后,它调用我的代码来确定用户的时间和奖励积分。知道为什么它可能会滞后,或者用音乐及时播放音效的更好方法吗?
编辑:我最近尝试了一些没有结果的事情。首先,我尝试在歌曲中适当的时间自动播放声音。仍然有滞后,所以我不认为触摸事件是缓慢的。我还尝试了3种不同的声音库。然而,当我在模拟器中跑步时,它似乎并不是迟钝的。有没有人有想法?我一无所知,这是我无法真正解决的一个重要特征......
答案 0 :(得分:1)
你应该避免使用这段代码: - [[SimpleAudioEngine sharedEngine] preloadEffect:@" Assist.wav"];
在应用程序启动时,您应该通过编写以下代码加载您的框架SimpleAudioEngine: -
// SimpleAudioEngine * palySound;在.h文件中创建对象。 palySound = [SimpleAudioEngine sharedEngine];
每当你想播放声音时,你都可以写:[palySound playEffect:@" Assist.wav"];
答案 1 :(得分: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];
你不应该有任何滞后。
答案 2 :(得分:0)
你试过Finch吗?它声称播放低延迟的声音,它也只是OpenAL的包装。
除此之外,我对OpenAL真的没有经验,但可以想到两个可能的滞后原因:
主线程太忙 - 尝试将工作从其卸载到其他线程 线程。
也许OpenAL定义的缓冲区太大,因此管道将整个声音加载到缓冲区(或其中的一大块),然后才开始播放。