“ __ CFRunLoopModeFindSourceForMachPort使用AVAudioPlayer时返回NULL”消息

问题描述 投票:0回答:1

我们正在开发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())确实消除了消息。

我们确实在此链接中找到了产生消息的源代码:

https://github.com/apple/swift-corelibs-foundation/blob/master/CoreFoundation/RunLoop.subproj/CFRunLoop.c

但是除了抽象级别,我们不了解它,并且不确定在AVFoundation中如何涉及运行循环。

很多Google搜索都没有帮助。正如我指出的那样,这似乎根本没有引起任何明显的问题。很高兴知道为什么会这样,以及如何解决它或确定它永远不会成为问题。

我们正在开发SpriteKit游戏。为了更好地控制声音效果,我们从使用SKAudioNodes切换到使用一些AVAudioPlayers。尽管在...

ios sprite-kit avfoundation avaudioplayer mach
1个回答
0
投票

我们仍在努力,但是已经进行了足够的实验,很明显我们应该如何做。大纲:

© www.soinside.com 2019 - 2024. All rights reserved.