以下代碼在模擬器(Xcode 8.1 + iPhone7)中運行會在第一次播放效果音時有半秒到1秒(甚至更長!)的延時,隨後再播放就沒有延時了。
let sound = SKAction.playSoundFileNamed("explosion.wav", waitForCompletion: false) run(sound) player.removeFromParent()
我們這裡播放聲音使用的是SKAction對應的動作.至於為什麼會在第一次播放爆炸音效的時候會有延時,是因為在模擬器中初始化聲音的模擬系統需要一定時間.如果上述代碼放到真機上運行是不會有絲毫延時的.
雖說這個問題無關痛癢,但現在有強迫症的程序猿們也是越來越多了,如何fix這個問題呢?
一種解決辦法是播放背景音樂!
在iOS 9中,SpriteKit提供了一個新的節點:SKAudioNode,可以完美的達到這個目的.由於其播放時已經完成了模擬器聲音系統的初始化,所以以後再次播放音效也就不會再出現任何延時了:
if let musicURL = Bundle.main.url(forResource: "music", withExtension: "m4a"){ bgMusic = SKAudioNode(url: musicURL) addChild(bgMusic) }
SKAudioNode的一個特點是默認會無限循環播放,而且可以隨意停止播放,我們再也不用繁瑣的AVAudioPlayer播放聲音。