XAudio2에서 오디오 결함 디버깅

결함은 XAudio2에서 발생할 수 있습니다. 이 항목에서는 보고 방법 및 수정 방법에 대해 설명합니다.

이 개요에서는 다음 topics 다룹니다.

오디오 출력 문제 또는 결함의 원인

여러 가지 이유로 XAudio2 출력에서 결함이 발생할 수 있습니다.

  • XAudio2 원본 음성이 부족합니다. 클라이언트가 최신 오디오를 충분히 빠르게 제출하지 않습니다. 재생할 데이터가 없기 때문에 침묵이 표시됩니다.
  • 전체적으로 XAudio2에 과부하가 가집니다. Xms 오디오를 생성하는 데 Xms보다 오래 걸립니다. XAudio2는 오디오 디바이스에 필요한 만큼 빠르게 데이터를 생성할 수 없으므로 드롭아웃이 발생합니다. 한 번에 너무 많은 음성 또는 효과를 실행하거나, XAudio2 콜백에서 너무 많은 작업을 수행하거나, XAudio2 API를 너무 자주 호출할 수 있습니다.
  • 클라이언트의 일부 XAudio2 콜백 구현이 스레드를 차단할 수 있는 작업을 수행하므로 오디오 처리 스레드가 중단됩니다. 예를 들어 디스크에 액세스하거나, 다른 스레드와 동기화하거나, 차단할 수 있는 다른 함수를 호출할 수 있습니다. 콜백이 이러한 작업을 수행하도록 신호를 줄 수 있는 우선 순위가 낮은 백그라운드 스레드를 사용합니다.
  • 시스템 전체가 오버로드됩니다. XAudio2보다 동일하거나 높은 우선 순위로 실행되는 다른 스레드는 너무 많은 작업을 수행하고 있습니다. CPU 시간 동안 오디오 스레드와 경쟁합니다.

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에 알릴 수 있습니다.

    다른 경우에는 다음을 수행합니다.

    • 그래프의 활성 음성 및 효과, 특히 반향과 같은 비용이 많이 드는 효과의 수를 줄입니다.
    • 사용하지 않는 음성 및 효과를 사용하지 않도록 설정합니다.
    • 가능하면 IXAudio2::CreateSourceVoice에서 XAUDIO2_VOICE_NOSRC 및 XAUDIO2_VOICE_NOPITCH 플래그를 사용합니다. 샘플 속도 변환은 비용이 많이 듭니다.
    • 개별 음성의 샘플 속도를 줄입니다. 예를 들어 반향 효과를 호스팅하는 서브믹스 음성은 원본 음성이 전송하는 것보다 샘플 속도가 낮을 수 있습니다. 높은 충실도가 필요하지 않은 폭발 및 총소리와 같은 소리는 더 낮은 샘플 속도로 녹음할 수도 있습니다.
    • 콜백 구현이 가능한 한 적은 작업을 수행하고 차단하지 않도록 합니다.
    • XAudio2에 대한 호출을 줄입니다. 오디오 매개 변수는 일반적으로 모든 비디오 프레임에 대해 업데이트할 필요가 없습니다. 30ms 정도마다 충분합니다. 볼륨을 여러 번 연속으로 설정하는 것과 같은 중복 호출을 제거해야 합니다.
    • 게임의 전체 CPU 사용량을 줄입니다.

디버깅 기능

XAudio2 프로그래밍 참조