当第一个声音播放时,Sprite Kit游戏“hickup”

时间:2013-11-18 10:07:24

标签: sprite-kit

在我的精灵套件游戏中,当两个精灵碰撞时,我使用SKAction播放mp3文件。虽然游戏运行正常但我第一次发出声音时会注意到游戏中有一个小的“hickup”。完整的游戏停止了大约半秒钟。之后,一切都很好,以下所有声音都可以正常工作。我注意到在模拟器和我的iPhone 5s上的这种行为也是一样的。

我该怎么做才能防止这种情况发生?

3 个答案:

答案 0 :(得分:11)

您可以通过创建SKAction来播放声音来预加载声音文件。 (你不需要运行动作,因此声音实际上不会播放,但文件将被加载。)

SKAction *preload = [SKAction playSoundFileNamed:@"my-sound-effect.caf" waitForCompletion:NO];

您不必保存此实例以供日后重复使用;任何类似初始化的SKAction在运行时都会立即播放。

作为旁注,因为我很难找到这个链接,here's a link to a document containing Apple's "Best Practices for iOS Audio";搜索" Best"。它没有解决预加载问题,但它确实讨论了格式,并建议使用打包在CAF文件中的未压缩,IMA4或AAC声音。我想到了这个,因为你的例子是播放MP3,这可能会或者可能不会使用比你想要的更多的CPU。

答案 1 :(得分:4)

我有类似的问题所以这是我到目前为止所发现的(我不知道它是否解决了问题,因为我现在无法尝试)。

我认为问题在于你没有预加载音效。因此,当它第一次播放时,它会被加载然后播放。这就是你的游戏冻结的原因。

解决方案是在初始化场景时预加载效果。 您可以在this tutorial中找到一个示例(向下滚动到名为&#34的部分; Gratuitous Sound Effects")。这很清楚,也很好解释。

希望它有所帮助。

答案 2 :(得分:2)

Swift 2.x 中翻译Karl Voskuil 预加载声音回答:

let preloadSound = SKAction.playSoundFileNamed("my-sound-effect.caf", waitForCompletion: false)

所以你可以这样做:

playSound(preloadSound)

...

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