对于我的小游戏,我想为各种场景播放效果音效。
大多数情况下,它将与用户交互相关。(iphone)有很多AVAudioPlayer实例很好吗?
我可能需要一次播放多个声音。
我打算为每个声音分配AVAudioPlayer。
我不知道有一个约10-20 AVAudioPlayers viewController是好的。
(声音数据本身相当小,在aac中小于100k)
我只是觉得在类中声明10-20 AVAudioPlayer实例似乎很奇怪。
有没有更好的做法或者我只是过度思考呢?
对于我的小游戏,我想为各种场景播放效果音效。
大多数情况下,它将与用户交互相关。(iphone)有很多AVAudioPlayer实例很好吗?
我可能需要一次播放多个声音。
我打算为每个声音分配AVAudioPlayer。
我不知道有一个约10-20 AVAudioPlayers viewController是好的。
(声音数据本身相当小,在aac中小于100k)
我只是觉得在类中声明10-20 AVAudioPlayer实例似乎很奇怪。
有没有更好的做法或者我只是过度思考呢?
我认为在这种情况下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/
是的,这是罚款,有很多AVAudioPlayer
实例。我不知道有多少限制,但肯定超过了一打。
下面是一些陷阱:
AVAudioPlayer
不做级混合,所以如果你的声音是大批量的,他们可能会彼此并造成波形失真建设性的干扰。我设置了0.8的最大音量来尝试解决这个问题,但它不可靠。
如果您尝试同时启动它们,则使用play
方法可能最终导致它们不同步。相反,应尽快弄清楚用户不会注意到的时间,但要足够远,以便让代码有时间退出并准备好时间。然后使用[player playAtTime:soon]
。
下面是一些现在适用于我的代码。因人而异:
-(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
”变种是线程安全的,直到它为你工作,你应该调整污... 0.1
太快了,我在某些时候或其他所以我把它撞到了0.5
。)