我们正在开发SpriteKit游戏。为了更好地控制声音效果,我们从使用SKAudioNodes切换到使用一些AVAudioPlayers。尽管在游戏,帧频和声音方面一切似乎都运行良好,但是在物理设备上进行测试时,控制台输出中偶尔会出现错误消息(?):]
... [常规] __CFRunLoopModeFindSourceForMachPort为模式'kCFRunLoopDefaultMode'livePort返回NULL:#####
[它似乎在发生时并没有真正造成任何伤害(没有声音故障或帧频出现打ic或其他任何现象,但无法确切了解消息的含义以及发生的原因使我们感到紧张。
详细信息:
游戏是所有标准的SpriteKit,所有事件都是由SKActions驱动的,那里没有什么异常。
AVFoundation的用法如下。初始化应用声音:
class Sounds { let soundQueue: DispatchQueue init() { do { try AVAudioSession.sharedInstance().setActive(true) } catch { print(error.localizedDescription) } soundQueue = DispatchQueue.global(qos: .background) } func execute(_ soundActions: @escaping () -> Void) { soundQueue.async(execute: soundActions) } }
创建各种音效播放器:
guard let player = try? AVAudioPlayer(contentsOf: url) else { fatalError("Unable to instantiate AVAudioPlayer") } player.prepareToPlay()
播放声音效果:
let pan = stereoBalance(...) sounds.execute { if player.pan != pan { player.pan = pan } player.play() }
AVAudioPlayers都具有短的声音效果而没有循环,并且它们可以重复使用。我们总共创建了25个玩家,其中包括多个可以快速重复出现某些效果的玩家。对于特定的效果,我们以固定的顺序轮流播放该效果的播放器。我们已经验证,只要触发了播放器,其isPlaying就会为false,因此我们不会尝试在已经播放的内容上调用播放。
该消息并不常见。在5-10分钟的游戏过程中,可能会有数千种声音效果,我们可能会看到5-10次的消息。
[该消息似乎通常是在快速连续播放一堆声音效果时发生的,但是并没有感觉到它与该声音之间有100%的关联。
不使用分发队列(即,直接将sounds.execute调用soundActions())不能解决问题(尽管确实会导致游戏明显滞后)。将分派队列更改为其他一些优先级(如.utility)也不会影响该问题。
[使sounds.execute只是立即返回(即,实际上根本不调用闭包,因此没有play())确实消除了消息。
我们确实在此链接中找到了产生消息的源代码:
但是除了抽象级别,我们不了解它,并且不确定在AVFoundation中如何涉及运行循环。
很多Google搜索都没有帮助。正如我指出的那样,这似乎根本没有引起任何明显的问题。很高兴知道为什么会这样,以及如何解决它或确定它永远不会成为问题。
我们正在开发SpriteKit游戏。为了更好地控制声音效果,我们从使用SKAudioNodes切换到使用一些AVAudioPlayers。尽管在...
我们仍在努力,但是已经进行了足够的实验,很明显我们应该如何做。大纲: