为什么我的声音让我的游戏在 Swift Spritekit 中滞后?

Why is my sound making my game lag in Swift Spritekit?

当我的英雄节点收集硬币时我有这个声音效果并且我的游戏中有这个小问题。当收集硬币时有声音时,它不像其他游戏那样流畅。我究竟做错了什么?这是我的声音代码:

  class GameScene: SKScene, SKPhysicsContactDelegate {

   var coinSound =  NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("coin", ofType: "wav")!)
   var coinAudioPlayer = AVAudioPlayer()

   override func didMoveToView(view: SKView) {

   coinAudioPlayer = AVAudioPlayer(contentsOfURL: coinSound, error: nil)
   coinAudioPlayer.pause()
   }

   if firstBody.categoryBitMask == HeroCategory && secondBody.categoryBitMask == CoinCategory {

   coinAudioPlayer.prepareToPlay()
   coinAudioPlayer.play()
   coinAudioPlayer.currentTime = NSTimeInterval(1.0)
    }

您不应该在碰撞时调用 prepareToPlay,prepareToPlay 会设置声音缓冲区,在您的 didMoveToView 函数中执行此操作

使用SKAction.playSoundFileNamed。当您提前创建一个 SKAction 实例时,它会进行所有必要的准备以执行操作(在本例中为播放声音),而不会在游戏过程中出现延迟。要 运行 动作(播放声音),请在节点上调用 runAction - 这可以是任何节点,甚至是场景本身。

由于使用哪个节点来实现声音目的并不重要,请使用最方便的那个。例如,如果您只是播放声音,您可以在现场调用 runAction。但是,如果您的声音是一个动作组或序列的一部分,例如,动画精灵,您可以使声音动作成为该序列的一部分,并在您正在动画的精灵上播放它。

有关操作的更多信息,请参阅 SpriteKit Programming Guide


不相关 Swift 提示:对于不会更改的引用,请使用 let 而不是 var。它可以帮助您避免以后引入错误,并且它可能还可以帮助编译器优化您的代码。