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

3

我的游戏基本上已经完成。在Xcode中检查了内存泄漏,发现每次游戏运行时会泄漏约0.3 MB。然后去instruments工具中查看数据持久化。

罪魁祸首1:

SKTexture被频繁调用,但没有不断增长

罪魁祸首2:

我希望我能记得确切的语法,它是类似于AudioSource的东西,在调用这一行代码时发生:SKAction.playSoundFileNamed(...)

所以我去游戏的“设置”页面关闭了声音。再次测试内存使用情况,结果稳定。我还意识到AVAudioPlayer存在内存泄漏问题,因为音效和主题通过不同的机制运行。

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

有没有什么巨大的锤子可以清理掉显然处于强引用循环中的音频源?当showPhysics被调用时,我也遇到了GameViewController的问题。我认为我的问题可能是游戏结构的问题。主菜单调用了一个视图和场景,所以你有一个场景内嵌在另一个场景中。关卡场景的实例似乎释放得很好,但留下了一些阴影音频错误。有什么解决办法吗?


你解决了这个问题吗?我也发现了一个内存泄漏,但是当我关闭声音时它就不会出现。 - cbuck12000
1
我按原样发布了它,然后它通过了苹果的测试。可能是框架中的一个错误。一直忙于后端代码,还没有回到我最喜欢的语言/IDE:Swift/Xcode。我发现当像SpriteKit这样的高级库出现问题时,有一个更低级别的库,比如CF- *,效果更好。 - Ryan Dines
1个回答

5
你应该使用SKAudioNode实例来避免内存泄漏,因为已经有一段时间SKAction.playSoundFileNamed存在这个问题。在SKScene中可以这样做:
// Initializing the SKAudioNode instance:
let soundNode = SKAudioNode(fileNamed: "mySound")
audioNode.autoplayLooped = false    

// Initializing the audio's duration SKAction:
let soundDuration : TimeInterval = 2 // For a 2 second 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
希望这能对您有所帮助!祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接