声源无法加载Swift SKAction

时间:2014-10-22 22:25:10

标签: ios swift sprite-kit skaction

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

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

如果您需要它,以下是每次点击屏幕时我播放文件的方式:

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

这种情况不会经常发生,可能是应用程序的10次运行中的1次。大多数时候一切都按预期工作。我希望我知道我在做什么导致崩溃,但我不知道!我只是在它没有崩溃的时候看起来没有什么不同。然后突然间我得到了这个问题......

2 个答案:

答案 0 :(得分:4)

首先,看起来你正在使用mp3文件播放(短)音效。使用mp3时,音频会被压缩。在内存中,它将具有不同的,更大的尺寸。还存在解码性能损失(解码花费CPU时间)。最重要的是,我在谈论mp3文件的原因可以在docs

中找到
  

使用硬件辅助解码时,设备只能播放   一次支持的格式之一的单个实例。对于   例如,如果您正在使用硬件播放立体声MP3声音   编解码器,第二个同步MP3声音将使用软件解码。   同样,您无法同时播放AAC和ALAC声音   使用硬件。如果iPod应用程序正在播放AAC或MP3声音   在后台,它声称硬件编解码器;你的申请   然后使用软件解码播放AAC,ALAC和MP3音频。

正如您所看到的,问题是一次只能使用硬件播放一个mp3文件。如果你一次播放多个mp3,它们将被软件解码,这很慢。

所以,我建议你使用.wav或.caf文件来播放声音效果。 mp3可能对背景音乐很有用。

关于崩溃问题:

  • 尝试使用 .wav .caf 文件而不是.mp3
  • 尝试对SKAction持有强引用,并按照Reece Kenney的建议重复使用。

答案 1 :(得分:3)

如果您通过playSound功能播放声音,它将起作用

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

playSound:

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