Мы работаем над игрой SpriteKit. Чтобы получить больше контроля над звуковыми эффектами, мы перешли от использования SKAudioNodes к использованию некоторых AVAudioPlayers. Хотя кажется, что все работает хорошо с точки зрения игрового процесса, частоты кадров и звуков, мы видим случайные сообщения об ошибках (?) В выводе консоли при тестировании на физических устройствах:
... [general] __CFRunLoopModeFindSourceForMachPort возвратил NULL для режима 'kCFRunLoopDefaultMode' livePort: #####
Похоже, что он действительно не причиняет никакого вреда (без сбоев звука или сбоев в частоте кадров или чем-либо еще), но неТочное понимание того, что означает сообщение и почему оно происходит, заставляет нас нервничать.
Детали:
Игра полностью стандартная, 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, поэтому мы не пытаемся запустить play на том, что уже воспроизводится.
Сообщение не так часто. В течение 5-10 минутной игры, возможно, с тысячами звуковых эффектов, мы видим сообщение, может быть, 5-10 раз.
Похоже, что сообщение возникает чаще всего, когда в звуковом эффекте играютбыстрая последовательность, но не похоже, что это на 100% коррелирует с этим.
Не использование очереди отправки (т. е. наличие звука.execute только для прямого вызова soundActions ()) не решает проблему (хотячто приводит к значительному отставанию игры). Изменение очереди отправки на некоторые другие приоритеты, такие как .utility, также не влияет на проблему.
Звуковое выполнение .execute просто немедленно возвращается (т. Е. Вообще не вызывает закрытие, поэтому нетplay ()) удаляет сообщения.
Мы нашли исходный код, который создает сообщение по этой ссылке:
https://github.com/apple/swift-corelibs-foundation/blob/master/CoreFoundation/RunLoop.subproj/CFRunLoop.c
, но мы не понимаемкроме как на абстрактном уровне, и не уверены, как циклы выполнения участвуют в AVFoundation.
Многие поиски в Google ничего не дали. И, как я указал, это, кажется, не вызывает заметных проблем вообще. Хотелось бы знать, почему это происходит, и как это исправить, или быть уверенным, что это никогда не станет проблемой.