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