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

Posted

技术标签:

【中文标题】为啥我的声音让我的游戏在 Swift Spritekit 中滞后?【英文标题】:Why is my sound making my game lag in Swift Spritekit?为什么我的声音让我的游戏在 Swift Spritekit 中滞后? 【发布时间】:2015-04-12 03:29:00 【问题描述】:

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

  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)
    

【问题讨论】:

有什么理由不使用SKAction.playSoundFileNamed 我不知道你能做到这一点。代码还有更多内容还是仅此而已。谢谢。 【参考方案1】:

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

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

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


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

【讨论】:

我将这个添加到英雄和硬币发生接触的地方,我得到一个错误:let playSound = SKAction.playSoundFileNamed("coin", waitForCompletion: true) 这是我得到的错误:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“在主包中找不到资源硬币” 它工作我忘了放.wav。谢谢它完美地工作! 我可以停止声音吗,因为我的游戏在英雄死亡后收集硬币,我希望在发生这种情况时不播放声音?谢谢! 您的意思是要在英雄死亡时切断任何当前播放的声音,或者防止与死去的英雄发生碰撞时播放声音?对于前者,请参阅 runAction:withKey:removeActionForKey:。对于后者,请在播放声音之前检查英雄是否已死亡。【参考方案2】:

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

【讨论】:

当我将 prepareToPlay 放入 didMoveToView 时,我的游戏仍然有延迟。

以上是关于为啥我的声音让我的游戏在 Swift Spritekit 中滞后?的主要内容,如果未能解决你的问题,请参考以下文章

我的代码有啥问题? Swift 3 sprite kit 信号 sigabbt [关闭]

Swift Sprite Kit 中的游戏中心

Swift Sprite Kit 再次调用 Function

使用 Sprite Kit 画线时播放声音

iOS 如何在 Sprite Kit 游戏中创建音频淡入/淡出效果?

Sprite不会用手指/ SpriteKit / Swift 3移动