【发布时间】:2016-11-23 20:43:58
【问题描述】:
我正在使用 Sprite Kit 为 iOS 9+ 开发游戏,最好使用 Swift 库。
目前我正在使用 Singleton 来预加载我的音频文件,每个文件都连接到一个单独的 AVAudioPlayer 实例。
这里有一个简短的代码片段来了解这个想法:
import SpriteKit
import AudioToolbox
import AVFoundation
class AudioEngine {
static let sharedInstance = AudioEngine()
internal var sfxPing: AVAudioPlayer
private init() {
self.sfxPing = AVAudioPlayer()
if let path = NSBundle.mainBundle().pathForResource("ping", ofType: "m4a") {
do {
let url = NSURL(fileURLWithPath:path)
sfxPing = try AVAudioPlayer(contentsOfURL: url)
sfxPing.prepareToPlay()
} catch {
print("ERROR: Can't load ping.m4a audio file.")
}
}
}
}
此 Singleton 在应用启动期间初始化。在游戏循环中,我只需调用以下行来播放特定的音频文件:
AudioEngine.sharedInstance.sfxPing.play()
这基本上是可行的,但是当我在 iPad Air 上播放文件并且帧速率从 60.0 下降到 56.0 时,我总是会出现故障。
有人知道如何用 AVAudioPlayer 解决这个性能问题吗?
我还留意了 3rd 方库,即:
- AudioKit [看起来很沉重]
- ObjectAL [最后更新 2013 ...]
- AVAudioEngine [基于 AVAudioPlayer,同样的问题?]
要求:
- 播放大量非常短的样本(如击球、击球等)
- 播放一些运动效果(这样投球会很好)
- 循环播放一些背景/环境声音
- 没有令人讨厌的故障/帧率下降!
您能否根据我的要求推荐上述任何库或使用上述代码指出问题?
更新:
播放短音:
self.runAction(SKAction.playSoundFileNamed("sfx.caf", waitForCompletion: false))
确实提高了帧速率。 I exported the audio files with Audiacity to the .caf format (Apple's Core Audio Format). 但在本教程中,它们使用“Signed 32-bit PCM”编码导出,这在我的情况下会导致音频播放受到干扰。使用任何其他编码选项(32-bit float、U-Law、A-Law 等)对我来说都很好。
为什么使用caf 格式?因为它是未压缩的,因此与m4a 等压缩格式相比,它以更少的 CPU 开销更快地加载到内存中。对于在很短的时间间隔内播放很多短音效,这是有道理的,对于消耗几千字节的短音频文件,磁盘使用不会受到太大影响。对于较大的音频文件,例如环境音乐和背景音乐,使用压缩格式(mp3、m4a)显然是更好的选择。
【问题讨论】:
-
stackoverflow.com/questions/25646583/… 这可能会有所帮助:)
-
@Konsy:感谢您的评论。我知道这个链接,因为我自己发布了一个答案;-) 但我的问题无法通过循环解决。这对于像马达或火箭推力这样的音效很有用,但是我的音效会反复播放,没有像用户开枪那样的精确模式。对问题中列出的框架有任何进一步的想法和/或建议吗?跨度>
-
使用Sprite Kit的方法怎么样?喜欢
SKAction.playSoundFileNamed。我没有测试自己,但我认为它已针对不降低帧速率进行了优化。可能值得一试。 -
@Giorgio 对不起,我不记得了。从那时起很久以前。这些问题不是同时在较新的 SDK 中得到解决了吗??
-
@Giorgio 真的很抱歉我帮不了你。太久了。我只记得我还必须实施各种讨厌的黑客攻击。我相信以秒为单位存储效果的播放长度然后阻止我的 play() 函数,只要在播放另一个文件之前播放文件......这样的东西:-/
标签: ios swift audio avaudioplayer audiokit