AVAudioPlayer производит лаг, несмотря на то, что prepareToPlay () в Swift

18

Воспроизведение очень короткого звука (~ 0,5 с) вызывает икоту (например, отставание) в моей игре IIS SpriteKit, запрограммированной в Swift. В других вопросах я читал, что должен prepareToPlay() звука, который я сделал.

Я даже использовал переменную ( soundReady ), чтобы проверить, подготовлен ли звук до ее воспроизведения. Я также перерабатываю звук, когда он закончил игру ( audioPlayerDidFinishPlaying() ). Вот соответствующие части кода:

class GameScene: SKScene, AVAudioPlayerDelegate {

   var splashSound = NSURL()
   var audioPlayer = AVAudioPlayer()
   var soundReady = false

   override func didMoveToView(view: SKView) {
      let path = NSBundle.mainBundle().pathForResource("plopSound", ofType: "m4a")
      splashSound = NSURL(fileURLWithPath: path)
      audioPlayer = AVAudioPlayer(contentsOfURL: splashSound, error: nil)
      audioPlayer.delegate = self
      soundReady = audioPlayer.prepareToPlay()
   }

   func playSound(){
      if(soundReady){
         audioPlayer.play()
         soundReady = false
      }
   }

   func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool){
      //Prepare to play after Sound finished playing
      soundReady = audioPlayer.prepareToPlay()
   }
}

Я понятия не имею, где я ошибся в этом. Я чувствую, что я пробовал все (включая, но не ограничиваясь: только готовить один раз, готовить сразу после игры, не использовать переменную, а просто подготовитьToPlay ()).

Дополнительная информация:

  • Звук воспроизводится без задержек.
  • Как быстро звук воспроизводится после последнего финиша, похоже, не влияет на задержку.
задан Timme 26.08.2014 в 12:32
источник
  • Разве DoMoveToView не похож на UIViewController.ViewDidAppear ()? То есть, он срабатывает только после того, как сцена полностью готова. Документация Apple, похоже, сейчас увязана, поэтому я проведу некоторое время. –  Henry 23.10.2014 в 17:24
  • Вы пробовали играть в другой поток? –  mbo42 19.11.2014 в 13:54

2 ответа

14

Я столкнулся с этой проблемой и воспроизвел звук в backgroundQueue.

Это хороший пример: Ссылка .

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    audioPlayer.play()
})
    
ответ дан brilliantairic 06.05.2015 в 08:47
  • Большое спасибо @brilliantairic! Однако я предпочитаю однострочный: dispatch_async (dispatch_get_global_queue (QOS_CLASS_BACKGROUND, 0)) { –  CodeMonkey 06.05.2016 в 13:20
  • Спасибо, что вы меня спасете! –  Jorge OM 20.04.2018 в 15:47
4

Просто добавив версию Swift 3 от @brilliantairic.

DispatchQueue.global().async {
    audioPlayer.play()
}
    
ответ дан T R Bremm 03.10.2017 в 14:31