Что вы используете для воспроизведения звука в играх iPhone? - PullRequest
28 голосов
/ 12 июня 2009

У меня высокопроизводительная игра для iPhone, в которую я хотел бы добавить звуки. Похоже, есть три основных варианта: (1) AVAudioPlayer, (2) аудио-очереди и (3) OpenAL. Я бы не хотел писать страницы низкоуровневого кода просто для воспроизведения сэмпла, поэтому я бы хотел использовать AVAudioPlayer. Проблема в том, что кажется, что это убивает производительность - я сделал простое измерение, используя CFAbsoluteTimeGetCurrent, а сообщение play, кажется, занимает где-то от 9 до 30 мс, чтобы закончить. Это довольно печально, учитывая, что 25 мс == 40 кадров в секунду.

Конечно, есть метод prepareToPlay, который должен ускорить процесс. Вот почему я написал простой класс, который имеет в своем распоряжении несколько AVAudioPlayer с, готовит их заранее, а затем воспроизводит семпл, используя подготовленный проигрыватель. Никакой сигары, все же это занимает ~ 20 мс, о которых я упоминал выше.

Такая игра непригодна для игр, так что вы используете для воспроизведения звуков с приличной производительностью на iPhone? Я что-то не так делаю с AVAudioPlayer? Вы играете звуки с аудио-очередями? (Я написал что-то похожее на AVAudioPlayer до того, как вышла версия 2.2, и я хотел бы сэкономить этот опыт.) Используете ли вы OpenAL? Если да, есть ли простой способ воспроизведения звуков с помощью OpenAL, или вам приходится писать страницы кода?


Обновление: Да, воспроизведение звуков с помощью OpenAL довольно просто .


Ответы [ 5 ]

8 голосов
/ 15 июня 2009

AVAudioPlayer очень маргинален для игрового звука. Решение AudioQueue или OpenAL путем адаптации одного из примеров, безусловно, является подходящим способом. таким образом задержка намного более контролируема.

7 голосов
/ 21 июня 2012

Если вы звоните play в главном потоке, попробуйте запустить его в отдельном потоке. То, что я в итоге сделал:

#include <dispatch/dispatch.h>

dispatch_queue_t playQueue = dispatch_queue_create("com.example.playqueue", NULL);

AVAudioPlayer* player = ...
dispatch_async(playQueue, ^{
    [player play];
});

, который исправил худшее из заиканий на частоте кадров, которые я испытывал.

2 голосов
/ 29 августа 2009

Использование CocosDenshion - это бесплатно, просто и работает. Он включает AVAudioPlayer для фоновых треков и OpenAL для звуков.

2 голосов
/ 13 июня 2009

Я использую OpenAL и классы, которые пришли с примером кода CrashLanding. До сих пор все работало нормально, одновременно проигрывая сэмплы и зацикливая музыку. В настоящее время я изучаю, как освободить память, выделенную для звука (файл .wav), когда, например, я хочу воспроизвести вступительную музыку только один раз.

0 голосов
/ 12 июня 2009

Хотите проверить буферизацию используемой реализацией? Это может быть как-то связано с задержкой в ​​20 мс, которую вы испытываете. то есть попробуйте поиграться с размером буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...