ios - AVAudioPlayer produce retraso a pesar de prepareToPlay() en Swift
lag (2)
Reproducir un sonido muy corto (~ 0.5s) produce un problema (como un retraso) en mi juego SpriteKit iOS programado en Swift. En otras preguntas, leí que debería prepareToPlay()
el sonido, lo que hice.
Incluso utilicé una variable ( soundReady
) para verificar si el sonido está preparado antes de reproducirlo. También re-preparo el sonido cuando termina de reproducirse ( audioPlayerDidFinishPlaying()
). Aquí están las partes relevantes del código:
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()
}
}
No tengo idea de dónde me he equivocado en este caso. Siento que lo he intentado todo (incluyendo, pero no limitado a: solo prepararme una vez, prepararme justo después de jugar, no usar una variable, solo prepararPlayar ()).
Información Adicional:
- El sonido se reproduce sin demora.
- La velocidad con la que se reproduce el sonido después del último final no parece afectar el retraso.
Me encontré con este mismo problema y reproduje el sonido en la backgroundQueue.
Este es un buen ejemplo: https://.com/a/25070476/586204 .
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
audioPlayer.play()
})
Simplemente agregando una versión Swift 3 de la solución de @brilliantairic.
DispatchQueue.global().async {
audioPlayer.play()
}