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 错误

SpriteKit 游戏中的高 CPU 和帧率下降

SpriteKit 游戏中的高 CPU 使用率

如何有效地暂停 spritekit 中的游戏?

spritekit 游戏中的动态贝塞尔绘图 - 最佳(性能)方法?

iOS Spritekit 游戏中的肌酐水平