(iphone) Хорошо ли иметь много экземпляров AVAudioPlayer? - PullRequest
0 голосов
/ 31 мая 2011

В моей маленькой игре я бы хотел сыграть эффект для различных сценариев.
В основном это будет связано с взаимодействием с пользователем.

Мне может понадобиться воспроизвести несколько звуков одновременно.

Я планирую выделить AVAudioPlayer для каждого звука.
Интересно, что viewController, имеющий около 10-20 AVAudioPlayers, в порядке.
(сами звуковые данные довольно малы, менее 100 КБ в aac)

Мне просто кажется, что объявление 10-20 экземпляра AVAudioPlayer в классе кажется странным.
Есть ли лучший способ сделать это, или я просто слишком обдумал это?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2013

Да, хорошо иметь много экземпляров 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" является поточно-ориентированным, и вы должны отрегулировать наклон до тех пор, пока он не будет работать для вас ... 0.1 был слишком быстрымдля меня в тот или иной момент, поэтому я поднял его до 0.5.)

0 голосов
/ 16 июля 2011

Я думаю, что 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/

...