声音资源无法加载Swift SKAction

我有一个应用程序,每次触摸屏幕播放声音文件。 出于某种原因,应用程序将每隔一段时间崩溃,并出现以下错误:

reason: 'Resource tick.mp3 can not be loaded' 

如果你需要它,下面是我每次点击屏幕时如何播放文件:

 runAction(SKAction.playSoundFileNamed("tick.mp3", waitForCompletion: false)) 

这并不经常发生,也许每10次运行一次。 大多数情况下,一切都按预期工作。 我希望我知道我在做什么导致崩溃,但我不知道! 我只是把它看作与没有崩溃的时代没有什么不同。 然后突然之间我得到这个问题…

首先,看起来你正在使用mp3文件来播放(短)声音效果。 使用mp3时,audio被压缩。 在记忆中,它会有不同的,更大的尺寸。 还有一个解码性能损失(解码需要CPU时间)。 最重要的是,我谈论的MP3文件的原因可以在文档中find:

使用硬件辅助解码时,设备一次只能播放一种支持格式的单个实例。 例如,如果您使用硬件编解码器播放立体声MP3声音,则第二个同步MP3声音将使用软件解码。 同样,您不能同时使用硬件播放AAC和ALAC声音。 如果iPod应用程序在后台播放AAC或MP3声音,则声明了硬件编解码器; 您的应用程序将使用软件解码播放AAC,ALAC和MP3audio。

正如你所看到的,问题是一次只能使用硬件播放一个mp3文件。 如果一次播放多个mp3,则会用软件解码,速度很慢。

所以,我build议您使用.wav或.caf文件播放音效。 MP3可能会很好的背景音乐。

关于崩溃的问题:

  • 尝试使用.wav.caf文件而不是.mp3
  • 尝试对SKAction进行强有力的引用 ,并像Reece Kenney所build议的那样重用它。

如果您通过playSoundfunction播放声音,它将起作用

 var soundFile = SKAction.playSoundFileNamed("bark.wav", waitForCompletion: false) playSound(soundFile) 

播放声音:

 func playSound(soundVariable : SKAction) { runAction(soundVariable) }