【发布时间】: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