AVAudioPlayer 和 SpriteKit 游戏中的性能问题

AVAudioPlayer and performance issue in SpriteKit game

我在使用 AVAudioPlayer 和在我的 spritekit 游戏中播放短音时遇到问题。我有非常动态的游戏场景,当用户点击特定元素时,我想播放简单的 "beep" 声音,但我注意到使用 AVAudioPlayer 播放声音会导致严重的性能问题。

我的音频文件是 .mp3 格式。

我也试过 SKAction 方法 (playSoundFileNamed) 来播放声音,一切看起来几乎一样,我注意到了同样的性能问题。

我的问题是在 SpriteKit 中执行声音的最佳实践是什么。

PS:我试图找到 WWDC Adventure spritekit 示例代码来检查它们如何解决播放声音的问题,但不幸的是示例代码不再可用。

我认为你必须简单地回顾谁运行这个动作。 如果您的 sprite 涉及其他动作或某些上下文动画,您可以尝试从托管您的 sprite 的 SKNode 发出声音。 最好的方法是始终使用合理的 mp3 尺寸..

P.S。 :通常我更喜欢使用这个扩展来控制音量:

public extension SKAction {
    public class func playSoundFileNamed(fileName: String, atVolume: Float, waitForCompletion: Bool) -> SKAction {

        let nameOnly = (fileName as NSString).stringByDeletingPathExtension
        let fileExt  = (fileName as NSString).pathExtension

        let soundPath = NSBundle.mainBundle().URLForResource(nameOnly, withExtension: fileExt)


        var player: AVAudioPlayer! = AVAudioPlayer()
        do { player = try AVAudioPlayer(contentsOfURL: soundPath!, fileTypeHint: nil) }
        catch let error as NSError { print(error.description) }

        player.volume = atVolume

        let playAction: SKAction = SKAction.runBlock { () -> Void in
            player.play()
        }

        if(waitForCompletion){
            let waitAction = SKAction.waitForDuration(player.duration)
            let groupAction: SKAction = SKAction.group([playAction, waitAction])
            return groupAction
        }

        return playAction
    }
}

您可能会出现延迟,因为您没有预加载声音文件,因此在 creating/playing 时会得到一些 lag/delay。最佳做法通常是在应用启动时预加载您的音频文件,以便它们可以立即播放。

因此,对于 AVPlayer,只需在应用启动时将它们全部设置好,而不是在播放它们之前设置好。而不是当你想播放音乐时,你只需要播放 AVPlayer。

myAVPlayer1.play()

关于 SKAction.play... 是同一个问题。您需要创建对操作的引用,而不是直接调用它

因此在 DidMoveToView 上方的 gameScene 中创建声音属性

class GameScene: SKScene {

     let sound1 = SKAction.playSoundFileNamed("Test", waitForCompletion: false)

     ....
}

并且比在游戏中的正确位置 运行 它

runAction(sound1)

这样应该不会有延迟,因为声音已经预加载了。

希望对您有所帮助

关于性能,最好将音频文件转换为 .Wav 而不是 .mp3 然后处理器在使用文件之前不必解压缩文件。