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/     ,        是的,可以有许多“ 0”实例。我不知道限制是多少,但是肯定超过十几个。 这是一些陷阱:
AVAudioPlayer
不会进行电平混合,因此,如果您的声音音量很高,它们最终可能会彼此产生相长干扰,并导致波形失真。我将最大音量设置为0.8,以尝试解决此问题,但这并不可靠。 如果尝试同时启动它们,则使用
play
方法可能最终导致它们不同步启动。取而代之的是,找出一个足够使用户不会注意到的时间,但又要足够远,以使您的代码有时间退出,并有3秒钟的时间准备就绪。然后使用
[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是否是线程安全的,您应该调整斜率,直到它对您有用为止…ѭ7for在某些时候对我来说太快了,所以我撞了一下至
0.5
。)