对于我的小游戏,我想为各种场景播放效果声 大多数情况下,它将与用户交互相关。
我可能需要一次播放多个声音。
我打算为每个声音分配AVAudioPlayer 我想知道一个有大约10-20个AVAudioPlayers的viewController很好 (声音数据本身相当小,aac中小于100k)
我只是觉得在一个类中声明10-20个AVAudioPlayer实例看起来很奇怪 是否有更好的方法,或者我只是过度思考它?
答案 0 :(得分:0)
我认为OpenAL在这种情况下是更好的选择。不要担心,如果你不知道它。这里有一个很棒的视频教程(包含源代码):http://www.71squared.com/2009/05/iphone-game-programming-tutorial-9-sound-manager/
要查找更多信息,您可以访问: http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/comment-page-1/
答案 1 :(得分:0)
是的,有很多AVAudioPlayer
个实例可以。我不知道有多少限制,但它绝对是十几个。
以下是一些问题:
AVAudioPlayer
没有进行电平混音,所以如果你的声音音量很大,它们最终可能会相互干扰并导致波形失真。我设置的最大音量为0.8,试图解决这个问题,但这不可靠。
如果您尝试同时启动它们,使用play
方法最终可能会使它们不同步。相反,尽快找出用户不会注意到的时间,但距离足够远,以至于它会让您的代码有时间退出并AVFoundation
时间准备好。然后使用[player playAtTime:soon]
。
以下是一些现在适合我的代码。 YMMV:
-(void)play
{
BOOL success;
AVAudioPlayer *player = self.player;
player.numberOfLoops = -1;
player.currentTime = 0;
player.volume = _volume;
// NSLog(@"deviceCurrentTime=%f", player.deviceCurrentTime);
static double soon = 0;
if (soon < player.deviceCurrentTime) {
soon = player.deviceCurrentTime + 0.5; // why so flakey???
}
success = [player playAtTime:soon]; // too flakey for now
if (!success) {
NSLog(@"player %@ FAILED", player);
} else {
NSLog(@"player %@ %@ playing at: %f", player, [[player.url relativePath] lastPathComponent], soon);
}
}
(我不确定我的“soon
”var是否是线程安全的,你应该调整slop直到它适合你... 0.1
对我来说太快了点或其他,所以我把它提升到0.5
。)