AVAudioPlayer和SKAction.playSoundFileNamed(...)导致内存泄漏

时间:2016-02-23 16:27:59

标签: xcode swift memory-leaks avaudioplayer skaction

我的游戏基本上已经完成了。检查Xcode中是否有泄漏。发现我每次玩游戏时泄漏大约0.3 MB。然后去了仪器,看着持久的数据。

罪魁祸首1:

SKTexture,被称为很多,但没有持续增长

罪魁祸首2:

希望我记得确切的语法,它类似于AudioSource,并且在调用此行时发生:SKAction.playSoundFileNamed(...)

所以我进入了游戏的“设置”页面并关闭了声音。再次测试内存使用情况并且稳定。还意识到AVAudioPlayer正在泄漏,因为声音效果和主题贯穿不同的机制。

我尝试在关闭时将AVAudioPlayer的实例var backgroundAudio:AVAudioPlayer!设置为nil,这被声明为类变量,但没有帮助。

在一些强大的参考周期中,是否有一把巨大的锤子可以用来清理音频源?调用showPhysics时,我也遇到了GameViewController的问题。我认为我的问题可能是游戏的结构。主菜单调用视图和场景,因此您在场景中有一个场景。级别场景的实例似乎正在正确释放,但是留下了一些阴暗的音频错误。任何解决方案?

1 个答案:

答案 0 :(得分:2)

您应该使用SKAudioNode个实例以避免内存泄漏,SKAction.playSoundFileNamed已知此问题已有一段时间且尚未修补。做这样的事情(在SKScene内):

// initiating the SKAudioNode Instance:
let soundNode = SKAudioNode(fileNamed: "mySound")
audioNode.autoplayLooped = false    

// initiating audio's duration SKAction:
let soundDuration : TimeInterval = 2 // For a 2 seconds sound!
let waitToFinish = SKAction.wait(forDuration: soundDuration)

// adding the SKAudioNode instance to the SKScene:
self.addChild(audioNode)

// running the actions:
audioNode.run(SKAction.sequence([.play(), waitToFinish]), completion: {
// Removes the SKAudioNode from the SKScene to free the memory:
    audioNode.removeFromParent()
})

或者您可以在Github上查看我的GameAudioPlayer课程,因为在这种情况下它完全符合您的要求。它处理SKAudioNodes并避免内存泄漏,您还可以在播放之前加载声音资源:https://github.com/ThiagoAM/Game-Audio-Player

我希望能帮到你!祝你好运!