Поделиться через


Отладка временных сбоев звука в 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 мс или более. Следует исключить избыточные вызовы, такие как настройка тома несколько раз подряд.
    • Сократите общую загрузку ЦП в игре.

Средства отладки

Справочник по программированию в XAudio2