Cocos Denshion: воспроизведение звукового эффекта синхронно с музыкой - PullRequest
6 голосов
/ 09 января 2012

Я создаю музыкальную игру, и когда пользователь нажимает на заметку, он издает звук. Звук, естественно, должен воспроизводиться немедленно, когда пользователь нажимает, чтобы он мог сказать, успевают ли они с музыкой. Однако создается впечатление, что звук отстает, особенно когда нажатия клавиш становятся быстрее.

Мой фоновый музыкальный файл .m4a воспроизводится с помощью AVAudioPlayer. Я решил использовать это поверх Cocos Denshion, так как у меня есть доступ к свойству currentTime. Я могу ошибаться, но я не думаю, что смогу получить к этому доступ с помощью CocosDenshion.

Я сделал очень короткий WAV-файл (менее секунды). Я предварительно загружаю свой звуковой эффект в init:

[[SimpleAudioEngine sharedEngine] preloadEffect:@"Assist.wav"];

Затем, чтобы воспроизвести звуковой эффект, в CCTouchesBegan я звоню:

[[SimpleAudioEngine sharedEngine] playEffect:@"Assist.wav"];

После этого он вызывает мой код, чтобы определить время и очки пользователей. Любая идея, почему это может быть запаздывающим, или лучший способ вовремя воспроизвести звуковые эффекты с музыкой?

РЕДАКТИРОВАТЬ: Я пытался несколько вещей в последнее время безрезультатно. Сначала я попытался воспроизвести звуки автоматически, когда они подошли к подходящему времени в песне. Все еще было отставание, так что я не думаю, что это сенсорные события, которые происходят медленно. Я также попробовал 3 разных звуковых библиотеки.

Однако, когда я бегал в симуляторе, он, казалось, не отставал. У кого-нибудь есть идея? Я невежественен, и это главная особенность, которую я не могу вынести ...

Ответы [ 3 ]

1 голос
/ 09 января 2012

вам следует избегать этого кода: - [[SimpleAudioEngine sharedEngine] preloadEffect: @ "Assist.wav"];

при запуске приложения вы должны загрузить свой фреймворк SimpleAudioEngine, написав этот код: -

// SimpleAudioEngine * palySound;сделал объект в .h файле.palySound = [SimpleAudioEngine sharedEngine];

и всякий раз, когда вы хотите воспроизвести звук, вы можете написать: [palySound playEffect: @ "Assist.wav"];

0 голосов
/ 20 февраля 2012

Вы пробовали Финч ?Он утверждает, что воспроизводит звуки с низкой задержкой, а также является просто оболочкой для OpenAL.

Кроме этого, я действительно не разбираюсь в OpenAL, но могу вспомнить две возможные причины вашего отставания:

  1. Основной поток слишком занят - попробуйте перенести работу с него на другие потоки.

  2. Возможно, OpenAL определен с слишком большим буферомТаким образом, конвейер загружает весь звук в буфер (или большую его часть), и только после этого начинается воспроизведение.

0 голосов
/ 17 февраля 2012

Я не уверен, что вы делаете в вашем SoundEngine, но, по моему опыту, лучший способ избежать задержки при воспроизведении звука - назначить AVAudioPlayer для каждого звукового файла (если вы не хотитечтобы начать возиться с AudioQueues).

Вот пример:

Предположим, у вас есть AVAudioPlayer *assistPlayer; в вашем текущем контроллере представления.

В вашем viewDidLoad инициализируйте его своим звуком:

NSURL *wavURL = [[NSBundle mainBundle] URLForResource:@"Assist" withExtension:@"wav"];
assistPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:wavURL error:nil];

Затем, в вашем IBAction, где вы хотите воспроизвести файл, просто выполните:

[assistPlayer play];

Вы не должны получатьлаг.

...