【问题标题】:Use of an Audio Clip Causing Memory Leak使用音频剪辑导致内存泄漏
【发布时间】:2023-03-27 05:42:01
【问题描述】:

我有一个不时使用音频剪辑的 sprite-kit 游戏场景 (SKScene)。我不想每次需要运行一个简短的音频剪辑时都创建一个新动作 (SKAction),因为声音可能会断断续续。所以我用一个文件名初始化了一个动作变量,并准备好在必要时使用它。

class GameScene: SKScene {
    let audioMatchAction = SKAction.playSoundFileNamed("myAudio", waitForCompletion: false)
}

然后当我需要运行这个音频剪辑时,我只需使用以下代码行。

self.run(audioMatchAction)

考虑到所有情况,当视图控制器 (UIViewController) 设置场景时,有一些迹象表明内存可能会泄漏。所以我使用 Allocations 来查看发生了什么。它说有两个泄漏指向AudioToolbox 库。无论如何,我已将上面的行更改为以下内容。

let waitAction = SKAction.wait(forDuration: 1.0)
self.run(audioMatchAction, withKey: "audio")
self.run(waitAction, completion: {
    self.removeAction(forKey: "audio")
})

Allocations 仍然说当应用程序转换到游戏视图控制器时有两个泄漏。我已经阅读了几十个关于SKAction 和音频剪辑的主题。在某些主题中,他们建议我们使用 SKAudioNode 而不是 SKAction.playSoundFileNamed。我试过了。泄漏仍然存在。我什至用过AVAudioPlayer。我还有两处漏水。如果我完全停止调用音频剪辑,Allocations 将不会报告泄漏,这告诉我使用这些剪辑会导致泄漏。那么我能做些什么来阻止音频剪辑泄漏内存呢?谢谢。

更新

我想我昨天使用AVAudioPlayer 的以下代码行来查看泄漏是否会消失。

class GameScene: SKScene {
    let audioURLMatch = URL(fileURLWithPath: Bundle.main.path(forResource: "myAudio", ofType: "caf")!) as NSURL
    var audioURLMatchPlayer = AVAudioPlayer()
    override func didMove(to view: SKView) {
        // audio //
        do {
            audioURLMatchPlayer = try AVAudioPlayer(contentsOf: audioURLMatch as URL)
            audioURLMatchPlayer.prepareToPlay()
        } catch let error {

        }
    }
}

【问题讨论】:

  • stackoverflow.com/questions/21022433/… 的可能重复项,建议您改用 AVAudioPlayer。好的,你说你已经做到了,但如果你能显示代码会很好,因为我使用 AVAudioPlayer,我向你保证如果处理正确它不会泄漏。
  • @matt 感谢您的评论。我不记得确切的代码,但我记得参考了以下文章。 dzone.com/articles/…

标签: ios swift swift3 sprite-kit skscene


【解决方案1】:

为了将来参考,将 audioURLMatchPlayer 声明为类型而不是实例化播放器将防止内存泄漏。

使用var audioURLMatchPlayer: AVAudioPlayer? 而不是var audioURLMatchPlayer = AVAudioPlayer()

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 2013-09-07
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2014-06-07
    • 2013-11-20
    相关资源
    最近更新 更多