AVAudioPlayer和SpriteKit游戏中的性能问题

我在AVAudioPlayer上遇到问题,并在我的精灵游戏中播放短音。 我有相当dynamic的游戏场景,当用户点击特定元素时,我想要播放简单的“嘟嘟”声,但是我注意到,使用AVAudioPlayer播放声音会导致显着的性能问题。

我的audio文件是.mp3格式。

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

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

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

您可能会因为不预先加载声音文件而滞后,因此在创build/播放声音文件时会出现延迟/延迟。 最好的做法是通常在应用程序启动时预先加载audio文件,以便他们可以立即播放。

所以对于AVPlayers,只需在应用程序启动时将其全部设置,而不是在播放前。 当你想播放音乐,你只是玩AVPlayer。

myAVPlayer1.play() 

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

因此,在上面的DidMoveToView的gameScene中,您可以创build声音属性

 class GameScene: SKScene { let sound1 = SKAction.playSoundFileNamed("Test", waitForCompletion: false) .... } 

而不是在你的游戏中正确的位置运行它

 runAction(sound1) 

这种方式应该没有滞后,因为声音已经预先加载了。

希望这可以帮助

我想你必须简单地回顾一下谁来执行这个操作 。 如果您的精灵参与了其他操作或某些上下文animation,则可以尝试从承载精灵的SKNode启动声音。 最好的方法是始终使用合理的mp3尺寸..

PS:通常我很想用这个扩展来控制音量:

 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 } } 

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