SpriteKit 游戏中的 AVAudioPlayer 和性能问题
Posted
技术标签:
【中文标题】SpriteKit 游戏中的 AVAudioPlayer 和性能问题【英文标题】:AVAudioPlayer and performance issue in SpriteKit game 【发布时间】:2016-06-26 19:56:27 【问题描述】:我在使用 AVAudioPlayer 并在我的 spritekit 游戏中播放短音时遇到问题。我有非常动态的游戏场景,当用户点击特定元素时,我想播放简单的“哔”声,但我注意到使用 AVAudioPlayer 执行声音会导致严重的性能问题。
我的音频文件是 .mp3 格式。
我还尝试了 SKAction 方法 (playSoundFileNamed) 来执行声音,一切看起来几乎一样,我注意到同样的性能问题。
我的问题是在 SpriteKit 中执行声音的最佳做法是什么。
PS:我试图找到 WWDC Adventure spritekit 示例代码来检查它们如何解决播放声音的问题,但不幸的是示例代码不再可用。
【问题讨论】:
可能与***.com/questions/38031676/… 重复,我的回答可能会解决它,但我很犹豫自己申请 dupehammer 【参考方案1】:您可能会出现延迟,因为您没有预加载声音文件,因此在创建/播放它们时会出现一些延迟/延迟。最佳做法是通常在应用启动时预加载您的音频文件,以便它们可以立即播放。
因此,对于 AVPlayer,只需在应用启动时进行设置,而不是在播放之前进行设置。当你想播放音乐时,你只需播放 AVPlayer。
myAVPlayer1.play()
关于 SKAction.play ......这是同样的问题。您将需要创建对您的操作的引用,而不是直接调用它
因此,在 DidMoveToView 上方的 gameScene 中,您可以创建声音属性
class GameScene: SKScene
let sound1 = SKAction.playSoundFileNamed("Test", waitForCompletion: false)
....
然后在你的游戏中运行它的正确位置
runAction(sound1)
这样应该不会有延迟,因为声音已经预加载了。
希望对你有帮助
【讨论】:
【参考方案2】:我认为您必须简单地查看执行此操作的人员。
如果您的精灵参与其他动作或某些上下文动画,您可以尝试从托管您的精灵的SKNode
发出声音。
最好的方法是始终使用合理的 mp3 尺寸..
附: : 通常我更喜欢使用这个扩展来控制音量:
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
【讨论】:
【参考方案3】:关于性能,最好将音频文件转换为 .Wav 而不是 .mp3 处理器在使用它之前不必解压缩文件。
【讨论】:
以上是关于SpriteKit 游戏中的 AVAudioPlayer 和性能问题的主要内容,如果未能解决你的问题,请参考以下文章
线程 1:SpriteKit 游戏中的信号 SIGABRT 错误