Требуется ли для каждого отдельного звука экземпляр AVAudioPlayer? - PullRequest
2 голосов
/ 25 декабря 2011

У меня есть несколько игровых звуков, например, четыре разных звуковых сигнала, и каждый из них воспроизводится в зависимости от действия, которое выполняет пользователь. Нужно ли создавать экземпляры четырех разных AVAudioPlayer объектов?

Или мне нужен только один основной игрок? Если мне просто нужен один, то как мне переключить URL файла?

Вот что я делаю сейчас:

NSError *error;
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error];

но для инициализации требуется несколько секунд. Есть ли способ предварительно загрузить файлы и быстро переключаться между ними?

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Продолжайте создавать столько экземпляров, сколько у вас есть звуков.
После инициализации используйте метод prepareToPlay:

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

Вызов метода stop или разрешение звукачтобы закончить воспроизведение, отмените эту настройку.

Например:

NSError *error;
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error];
[soundPlayer prepareToPlay];

На данный момент вам нужно всего 4 песни, так что это будет преждевременной оптимизацией.Но если позже количество нужных вам звуков значительно увеличится, вы можете обернуть все это в подкласс и выполнить ленивую загрузку.Как указано в документации, использование метода stop эквивалентно выгрузке файла.

0 голосов
/ 26 декабря 2011

Вам не обязательно создавать экземпляры четырех различных AVAudioPlayer объектов, хотя это один из вариантов (который может быть самым простым, если у вас только есть четыре звука).

Один выМожно было бы заранее загрузить звуки в память, что можно сделать, используя метод initWithData вместо initWithContentsOfURL (предварительно загрузив все ваши звуковые файлы в NSData объекты).Это может немного ускорить процесс, хотя это также зависит от вашего звукового формата.Несжатые файлы, очевидно, будут загружаться гораздо быстрее, чем, например, MP3.

Если это все еще не работает для вас, лучше всего было бы взглянуть на некоторые из предоставленных аудиотехнологий более низкого уровня, которые больше подходят для работы в играх (OpenAL, Audio Toolbox и т. Д.),но это немного сложнее, чем простой AVVAudioPlayer.

...