我的AVAudioPlayer有问题,在我的spritekit游戏中播放短音。我有非常动态的游戏场景,当用户点击特定元素时,我想玩简单的" beep"声音,但我注意到使用AVAudioPlayer执行声音会导致严重的性能问题。
我的音频文件是.mp3格式。
此外,我尝试过SKAction方法(playSoundFileNamed)来执行声音,一切看起来几乎一样,我注意到了同样的性能问题。
我的问题是在SpriteKit中执行声音的最佳做法是什么。
PS:我试图找到WWDC Adventure spritekit示例代码,以检查它们如何解决播放声音的问题,但遗憾的是示例代码不再可用。
答案 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 然后,处理器在使用之前不得解压缩文件。