2016-06-23 2 views
0

Я работаю над разработкой игры для прошивки в SpriteKit рамках и Swift кодареализации коротких звуков в игре с spritekit и быстрым

Я собираюсь включить звук FX в игре, так что в этом смысле, я нужно использовать много коротких звуков, одновременно воспроизводить некоторые из них и синхронизироваться с другими событиями спрайтов. Мне не нужен точный контроль объема, циклов или остановок. Я пытаюсь следующие варианты с относительным успехом:

  • Я попытался использовать SKActions воспроизводить звуковые файлы с помощью playSoundFileNamed, поджимать переменные: подмигнули очень быстро и просто, но это создает непрерывный и растущий распределение памяти в OpenAL (Xcode Utils слежения) невозможно освободить, делая память увеличивается до аварии приложений (около 100KB для одного звука)

  • Я попытался использовать AudioToolbox рамку для воспроизведения звуковых файлов с помощью AudioServicesCreateSystemSoundID, но имеет ограничение, чтобы играть несколько файлы сразу

  • Я попытался использовать аудиоплеер, который использует AVFoundation. Он не генерирует утечки памяти, но это заставляет мое приложение задерживаться при выполнении действия звуков воспроизведения.

  • Я попытался использовать OpenAL, но я не могу найти какое-либо полезное руководство для простого внедрения в компиляции программирования SpriteKit & Swift, только в Objective-C

Какой у вас лучший подход к моей цели?

Спасибо

ответ

0

Обычно я preefer играть свой звук, используя хорошую библиотеку (простой sharedInstance на основе структуры AVFoundation) под названием SKTAudio из SKUtils:

func playSoundEffect(filename: String) { 
    let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil) 
    if (url == nil) { 
     print("Could not find file: \(filename)") 
     return 
    } 

    var error: NSError? = nil 
    do { 
     soundEffectPlayer = try AVAudioPlayer(contentsOfURL: url!) 
    } catch let error1 as NSError { 
     error = error1 
     soundEffectPlayer = nil 
    } 
    if let player = soundEffectPlayer { 
     player.numberOfLoops = 0 
     player.prepareToPlay() 
     player.play() 
    } else { 
     print("Could not create audio player: \(error!)") 
    } 
    } 
} 

Это очень прост в использовании, вы можете объявить его глобальным:

var audioManager : SKTAudio = SKTAudio.sharedInstance() 

Тогда вы можете играть эффект простой, как это:

self.audioManager.playSoundEffect("menu-click.mp3") 
+0

спасибо за ваш комментарий. SKTAudio - это то, что я использую, чтобы играть в фоновую музыку, но не справляется с производительностью при воспроизведении множества коротких звуков, потому что это недостаточно быстро для игр в реальном времени. Это приводит к задержкам и уменьшению количества узлов, что приводит к отставанию в игре. – Pandereich

0

Первое решение - использовать SKAudioNode. И если вы используете файлы SKS, вы можете размещать звук непосредственно на сцене. Не было проблем с памятью в этом классе. Вы должны проверить, работает ли аудиоинсталляция сцены перед воспроизведением звука, потому что, например, вы переходите к другой сцене.

Во-вторых - вы можете попробовать использовать ObjectAL (не OpenAL) http://kstenerud.github.io/ObjectAL-for-iPhone/

+0

спасибо. SKAudioNode не исправит мое приложение, так как я настроен на поддержку iOS 7.1 и более поздних версий, а SKAudioNode доступен из iOS 9.0 – Pandereich

+0

Я некоторое время назад взглянул на ObjectAL, но я боюсь, что он закодирован в Objetive-C и, к сожалению, Я новичок и не знаю, как интегрировать библиотеку в мой быстрый код. – Pandereich

+0

Вы используете cocoapods? – mikem