正在测试我的应用程序,并在播放声音文件(任何声音文件)时注意到一些有趣的东西。我注意到较小的声音文件会增加大约 0.01 mb 的内存,并且在播放后不会释放内存,而播放完成后较长的声音文件会增加大约 1.8 - 2.0 mb。
我使用仪器泄漏检查来测试应用程序,看看到底发生了什么,我收集到它确实是音频文件。
我通常使用 SKAction.playSoundFileNamed() 播放我的音频文件。不确定这是否与此有关。
let gameOver = SKAction.playSoundFileNamed("gameOver.wav", waitForCompletion: false)
sprite.runAction(gameOver)
不确定这是我的问题还是已知问题。或者这甚至是一个问题?只是好奇。
截图
前我遇到了这个问题,所以我尝试了AudioToolbox
框架作为替代方案,它同样有效,没有内存泄漏。
我有一些音效想用于游戏,所以我创建了一个像 bellow 这样的函数,它可以设置 sfx 数组中的所有systemSoundID
。
var sfx = [SystemSoundID]()
func createSfx() {
var i = 0
while i < 8 {
var fileName = ""
switch i {
case 0:
fileName = "coinCollected"
case 1:
fileName = "laserGun"
case 2:
fileName = "laserBeamShutOff"
case 3:
fileName = "powerDown"
case 4:
fileName = "shipMovement"
case 5:
fileName = "openBlockade"
case 6:
fileName = "invisibilityOn"
case 7:
fileName = "outOfFuel"
default:
print("Error creating sfx")
}
sfx.append(SystemSoundID())
let filePath = NSBundle.mainBundle().pathForResource(fileName, ofType: "wav")
let soundURL = NSURL(fileURLWithPath: filePath!)
AudioServicesCreateSystemSoundID(soundURL, &sfx[i])
i += 1
}
}
然后,您可以使用带有声音效果数组索引的 AudioServicesPlaySystemSound
播放声音效果,如下所示:
AudioServicesPlaySystemSound(sfx[1]) // Plays laserGun sound effect
另外,您知道,我在使用它时发现了一个问题。如果您使用AVAudioPlayer
播放背景音乐,则音效的音量不会超过设备上的中点。我不确定为什么会发生这种情况,但我浪费了很多时间试图寻找音效的替代品,这是最好的选择,尽管有轻微的音量问题。
希望这可以帮助一些正在寻找SKAction的良好替代品的人。