Отладка временных сбоев звука в XAudio2
В XAudio2 могут возникать сбои. В этом разделе рассматриваются способы их сообщения и некоторые подходы к их устранению.
В этом обзоре рассматриваются следующие темы:
- Причины проблем с выводом звука или сбоев
- Как XAudio2 сообщает о проблемах
- Подходы к устранению проблем
- Связанные темы
Причины проблем с выводом звука или сбоев
Сбои могут возникать в выходных данных XAudio2 по нескольким причинам.
- Исходный голос XAudio2 голодает. Клиент не отправляет ему свежий звук достаточно быстро. Вы получаете тишину, потому что в ней нет данных для воспроизведения.
- XAudio2 в целом перегружен. Для создания X мс звука требуется больше X мс. Вы получаете отспада, так как XAudio2 не может создавать данные так быстро, как это требуется звуковому устройству. Возможно, вы выполняете слишком много голосов или эффектов одновременно, выполняете слишком много работы в обратных вызовах XAudio2 или слишком часто вызываете API XAudio2.
- Поток обработки звука завис, так как клиент реализует некоторые обратные вызовы XAudio2, выполняет действия, которые могут блокировать поток. Например, это может быть доступ к диску, синхронизация с другими потоками или вызов других функций, которые могут блокироваться. Используйте фоновый поток с более низким приоритетом, который обратный вызов может сигнализировать для выполнения таких задач.
- Система в целом перегружена. Другие потоки, работающие с тем же или более высоким приоритетом, чем XAudio2, выполняют слишком много работы. Они конкурируют со звуковым потоком за время ЦП.
Как XAudio2 сообщает о проблемах
XAudio2 может сообщать о сбоях в отладочной сборке несколькими способами.
Если голос голодает, XAudio2 отображает сообщение в этой форме.
XAudio2: WARNING: Voice at 0xNNNNNNNN starved: no more source buffers are available, but no end-of-stream marker was received
Если аудиопоток выполняется слишком долго, XAudio2 отображает сообщение в этом виде.
XAudio2: WARNING: Spent Xms in audio thread; XAudio2 possibly overloaded
Как правило, это сообщение возникает вместе со следующим сообщением.
Если звуковому драйверу не удается вовремя подавать новые звуковые данные, XAudio2 отображает сообщение в этой форме.
XAudio2: WARNING: Glitch at output sample X
Вызов IXAudio2::GetPerformanceData предоставляет данные о производительности XAudio2, включая общее количество сбоев с момента запуска обработчика XAudio2.
Подходы к устранению проблем
Ниже приведены возможные способы уменьшения количества сбоев звука.
В случае голосового голода: увеличьте объем звуковых данных, которые будут помещены в очередь на голосе. Вы можете использовать IXAudio2SourceVoice::GetState для обнаружения количества буферов, помещенных в очередь в любой момент. Если вы по-прежнему видите ошибки нехватки голоса, но не слышите сбой, убедитесь, что настроен XAUDIO2_BUFFER. Флаги для XAUDIO2_END_OF_STREAM в окончательном буфере звука. Это указывает XAudio2 не ожидать, что больше буферов обязательно будут доступны после завершения этой операции.
В других случаях:
- Уменьшите количество активных голосов и эффектов на графике, особенно дорогостоящие эффекты, такие как реверберации.
- Отключите голоса и эффекты, которые вы не используете.
- По возможности используйте флаги XAUDIO2_VOICE_NOSRC и XAUDIO2_VOICE_NOPITCH в IXAudio2::CreateSourceVoice. Преобразование частоты выборки является дорогостоящим.
- Уменьшите частоту выборки отдельных голосов. Например, голос субмикса, в котором размещен эффект реверберации, может иметь более низкую частоту выборки, чем исходный голос, отправляемый на него. Такие звуки, как взрывы и выстрелы, которые не требуют высокой точности, также могут быть записаны при более низкой частоте выборки.
- Убедитесь, что реализации обратного вызова выполняют как можно меньше работы и никогда не блокируют.
- Выполнять меньше вызовов к XAudio2. Параметры звука обычно не нужно обновлять для каждого видеокадра. Достаточно каждых 30 мс или более. Следует исключить избыточные вызовы, такие как настройка тома несколько раз подряд.
- Сократите общую загрузку ЦП в игре.
Связанные темы