【问题标题】:Sprite Kit game "hickup" when the first sound is played播放第一个声音时 Spritekit 游戏“打嗝”
【发布时间】:2013-11-18 10:07:23
【问题描述】:

在我的 sprite kit 游戏中,当两个 sprite 发生碰撞时,我使用 SKAction 播放 mp3 文件。虽然游戏运行良好,但我在第一次播放声音时注意到游戏中有一个小“打嗝”。整个游戏停止大约半秒。之后一切都很好,所有后续声音都可以正常工作。我注意到模拟器中的这种行为和我的 iPhone 5s 一样。

我能做些什么来防止这种情况发生?

【问题讨论】:

  • 使用 AVAudioPlayer 或 ObjectAL 等音频引擎播放 (MP3) 音乐。

标签: sprite-kit


【解决方案1】:

您可以通过创建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";搜索“最佳”。它不涉及预加载,但确实讨论了格式,并建议使用打包在 CAF 文件中的未压缩、IMA4 或 AAC 声音。我之所以想到这一点,是因为您的示例正在播放 MP3,它最终可能会或可能不会使用比您想要的更多 CPU。

编辑 [2019 年 8 月,iOS12]:

五年后的现在,我意识到,“打嗝”并不是我一直认为的声音文件上的文件 I/O 造成的。我可以使用 Instruments “System Usage”(在运行 iOS12.4 的 iPhone 6 上)来证明 every SKAction playSoundFileNamed: 将从磁盘加载声音文件,即使它已经播放过。然而,这只是主线程第一次短暂挂起。后续从磁盘读取,无论是该文件还是其他声音文件,都相对较快。

我不知道是什么导致了初始延迟。但需要注意的是,您可以通过预加载或播放 any 音效来触发“打嗝”。预加载所有音效显然没有任何好处。

【讨论】:

  • 感谢您的建议。到目前为止,我使用了一个声音库,我在开始时预加载了所有声音。后来我只使用该库中的实例。到目前为止工作正常。
【解决方案2】:

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

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

所以以后你可以做:

playSound(preloadSound)

...

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

【讨论】:

    【解决方案3】:

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

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

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

    希望对你有帮助。

    【讨论】:

    • 就是这样!有趣的事情。几天前我读了那个教程,但我跳过了声音部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多