我正在使用SpriteKit
框架和Swift代码
我即将在游戏中包含声音FX,所以这样,我需要使用很多短音,同时播放其中一些,并与其他精灵事件同步。我不需要对音量,循环或停止进行精确控制。我正在尝试以下相关成功的选项:
我尝试使用SKActions
通过playSoundFileNamed
播放声音文件,预加载变量:它非常简单快速,但它创建了一个连续且不断增长的内存分配OpenAl(XCode utils tracking)无法解除分配,使内存增加到应用程序崩溃(每个声音大约100KB)
我尝试使用AudioToolbox
框架按AudioServicesCreateSystemSoundID
播放声音文件,但一次播放多个文件有限制
我尝试使用使用AVFoundation
的音频播放器。它不会产生任何内存泄漏,但当我执行播放声音的操作时,它会使我的应用程序延迟
我尝试使用OpenAL,但我找不到任何有用的指南,可以在编程组合SpriteKit& Swift,仅在Objective-C
哪种方法最适合我的目标?
谢谢
答案 0 :(得分:0)
通常,我喜欢使用来自SKUtils的名为 SKTAudio 的漂亮库(基于AVFoundation框架的简单sharedInstance)播放我的声音:
func playSoundEffect(filename: String) {
let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
if (url == nil) {
print("Could not find file: \(filename)")
return
}
var error: NSError? = nil
do {
soundEffectPlayer = try AVAudioPlayer(contentsOfURL: url!)
} catch let error1 as NSError {
error = error1
soundEffectPlayer = nil
}
if let player = soundEffectPlayer {
player.numberOfLoops = 0
player.prepareToPlay()
player.play()
} else {
print("Could not create audio player: \(error!)")
}
}
}
使用起来非常简单,您可以将其声明为全局变量:
var audioManager : SKTAudio = SKTAudio.sharedInstance()
然后你可以像这样简单地发挥效果:
self.audioManager.playSoundEffect("menu-click.mp3")
答案 1 :(得分:0)
首先解决方案 - 使用SKAudioNode。如果您使用的是SKS文件,则可以将声音直接放在场景中。该类没有内存问题。在播放声音之前,您必须检查场景的audioEngine是否正在运行 - 例如,您正在转换到另一个场景。
第二 - 你可以尝试使用ObjectAL(不是OpenAL)http://kstenerud.github.io/ObjectAL-for-iPhone/