我正在使用 SpriteKit
框架和 Swift 代码开发 iOS 游戏
我即将在游戏中包含声音 FX,因此,这样,我需要使用大量短声音,同时播放其中一些声音,并与其他 Sprite 事件同步。我不需要精确控制音量、循环或停止。我正在尝试以下选项并取得了相对成功:
我尝试使用
SKActions
通过playSoundFileNamed
来播放声音文件,预加载变量:这确实简单快捷,但它创建了一个OpenAl(XCode utils 跟踪)中连续且不断增长的内存分配无法释放,导致内存增加直至应用程序崩溃(每个声音大约 100KB)我尝试使用
AudioToolbox
框架通过AudioServicesCreateSystemSoundID
播放声音文件,但它有一次播放多个文件的限制我尝试使用使用
AVFoundation
的音频播放器。它不会产生任何内存泄漏,但当我执行播放声音的操作时,它会使我的应用程序延迟我尝试使用 OpenAL,但找不到任何有用的指南来轻松实现编程组合 SpriteKit 和 Swift,只能在 Objective-C 中找到
哪种方法是实现我的目标的最佳方法?
谢谢
最佳答案
通常,我更喜欢使用一个不错的库(一个基于 AVFoundation 框架的简单共享实例)来播放声音,该库名为 SKTAudio,来自 SKUtils :
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")
关于ios - 使用 spritekit 和 swift 在游戏中实现短声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37994401/