我有一个雪碧-工具包游戏场景(SKScene),使用音频剪辑不时.我不想创建一个新的动作(SKAction),每次我需要运行一个简短的音频剪辑,因为声音可能口吃。因此,我用文件名初始化了一个操作变量,并准备在必要时使用它。
class GameScene: SKScene {
let audioMatchAction = SKAction.playSoundFileNamed("myAudio", waitForCompletion: false)
}然后,当我需要运行这个音频剪辑时,我只使用下面的代码行。
self.run(audioMatchAction)考虑到所有情况,有迹象表明当视图控制器(UIViewController)设置场景时,内存可能会泄漏。因此,我使用了分配来查看发生了什么。它说有两个指向AudioToolbox库的漏洞。不管怎么说,我已经把上面的线改成了下面的一行。
let waitAction = SKAction.wait(forDuration: 1.0)
self.run(audioMatchAction, withKey: "audio")
self.run(waitAction, completion: {
self.removeAction(forKey: "audio")
})分配仍然说,当应用程序转换到游戏视图控制器时,有两个漏洞。我读过几十个关于SKAction和音频剪辑的主题。有些主题建议我们使用SKAudioNode而不是SKAction.playSoundFileNamed。我试过了。泄漏仍然存在。我甚至用过AVAudioPlayer。我还有两个漏洞。如果我完全停止调用音频剪辑,分配将不会报告泄漏,这告诉我,使用这些剪辑是造成泄漏。那么,我能做些什么来阻止音频剪辑泄漏内存呢?谢谢。
更新
我想我昨天使用了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 {
}
}
}

发布于 2017-12-28 22:48:08
作为将来的参考,将audioURLMatchPlayer声明为类型而不是实例化播放器将防止内存泄漏。
使用var audioURLMatchPlayer: AVAudioPlayer?而不是var audioURLMatchPlayer = AVAudioPlayer()
https://stackoverflow.com/questions/43826992
复制相似问题