SpriteKit游戏中的AVAudioPlayer和性能问题

时间:2016-06-26 19:56:27

标签: ios sprite-kit avaudioplayer skaction skscene

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

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

此外,我尝试过SKAction方法(playSoundFileNamed)来执行声音,一切看起来几乎一样,我注意到了同样的性能问题。

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

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

3 个答案:

答案 0 :(得分:2)

您可能会因为没有预加载声音文件而导致滞后,因此在创建/播放时会出现延迟/延迟。最佳做法是通常在应用程序启动时预加载音频文件,以便它们可以立即播放。

因此对于AVPlayers来说,只需将它们全部设置在应用程序启动时而不是在播放它们之前。比你想播放音乐时,你只需播放AVPlayer。

myAVPlayer1.play()

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

所以在你的gameScene上面的DidMoveToView你创建你的声音属性

class GameScene: SKScene {

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

     ....
}

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

runAction(sound1)

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

希望这有帮助

答案 1 :(得分:0)

我认为您必须简单地查看运行此操作的 。 如果您的精灵参与其他动作或某些上下文动画,您可以尝试从承载精灵的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
    }
}

答案 2 :(得分:0)

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