결함은 XAudio2에서 발생할 수 있으며, 이 항목에서는 보고 방법 및 수정 방법에 대해 설명합니다.
이 개요에서는 다음 항목을 다룹니다.
- 오디오 출력 문제 또는 결함 원인
- XAudio2에서 문제를 보고하는 방법
- 문제 해결 방법
- 관련 항목
오디오 출력 문제 또는 결함의 원인
여러 가지 이유로 XAudio2 출력에서 결함이 발생할 수 있습니다.
- XAudio2 원본 음성이 부족합니다. 클라이언트가 최신 오디오를 충분히 빠르게 제출하지 않습니다. 재생할 데이터가 없기 때문에 침묵이 있습니다.
- XAudio2는 전반적으로 과부하입니다. X ms의 오디오를 생성하는 데 X ms보다 더 오래 걸립니다. 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::CreateSourceVoiceXAUDIO2_VOICE_NOSRC 및 XAUDIO2_VOICE_NOPITCH 플래그를 사용합니다. 샘플 속도 변환은 비용이 많이 듭니다.
- 개별 음성의 샘플 속도를 줄입니다. 예를 들어 반향 효과를 호스팅하는 서브믹스 음성은 원본 음성에 보내는 것보다 샘플 속도가 낮을 수 있습니다. 높은 충실도를 필요로 하지 않는 폭발 및 총소리와 같은 소리도 더 낮은 샘플 속도로 기록할 수 있습니다.
- 콜백 구현이 가능한 한 적은 작업을 수행하고 차단하지 않도록 합니다.
- XAudio2에 대한 호출을 줄입니다. 오디오 매개 변수는 일반적으로 모든 비디오 프레임에 대해 업데이트할 필요가 없습니다. 30ms 정도마다 충분합니다. 볼륨을 여러 번 연속으로 설정하는 등 중복 호출을 제거해야 합니다.
- 게임의 전체 CPU 사용량을 줄입니다.
관련 항목