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
然后处理器在使用文件之前不必解压缩文件。
我在使用 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 然后处理器在使用文件之前不必解压缩文件。