Debuggen von Audiostörungen in XAudio2
In XAudio2 können Störungen auftreten. In diesem Thema wird erläutert, wie sie gemeldet werden, und einige Ansätze, um sie zu beheben.
In dieser Übersicht werden die folgenden Themen behandelt:
- Ursachen von Audioausgabeproblemen oder Störungen
- So meldet XAudio2 Probleme
- Ansätze zum Beheben von Problemen
- Zugehörige Themen
Ursachen von Audioausgabeproblemen oder Störungen
Störungen können in der XAudio2-Ausgabe aus verschiedenen Gründen auftreten.
- Eine XAudio2-Quellstimme ist ausgehungert. Der Client übermittelt keine neuen Audiodaten schnell genug an ihn. Sie erhalten Stille, weil es keine Daten zum Wiedergeben hat.
- XAudio2 als Ganzes ist überlastet. Es dauert länger als X ms, um X ms Audio zu erzeugen. Sie erhalten Aussetups, da XAudio2 Daten nicht so schnell erzeugen kann, wie das Audiogerät sie benötigt. Möglicherweise führen Sie zu viele Stimmen oder Effekte gleichzeitig aus, erledigen zu viel Arbeit in XAudio2-Rückrufen oder führen zu häufig XAudio2-API-Aufrufe aus.
- Der Audioverarbeitungsthread wird angehalten, da die Implementierung eines XAudio2-Rückrufs durch den Client Dinge ausführt, die den Thread blockieren können. Beispielsweise kann es sich um den Zugriff auf den Datenträger, die Synchronisierung mit anderen Threads oder das Aufrufen anderer Funktionen handeln, die möglicherweise blockiert werden. Verwenden Sie einen Hintergrundthread mit niedrigerer Priorität, den der Rückruf signalisieren kann, um solche Aufgaben auszuführen.
- Das System als Ganzes ist überladen. Andere Threads, die mit derselben oder höherer Priorität als XAudio2 ausgeführt werden, leisten zu viel Arbeit. Sie konkurrieren mit dem Audiothread um die CPU-Zeit.
So meldet XAudio2 Probleme
XAudio2 kann Störungen im Debugbuild auf verschiedene Arten kommunizieren.
Wenn eine Stimme ausgehungert wird, zeigt XAudio2 eine Nachricht in dieser Form an.
XAudio2: WARNING: Voice at 0xNNNNNNNN starved: no more source buffers are available, but no end-of-stream marker was received
Wenn der Audiothread zu lange ausgeführt wird, zeigt XAudio2 eine Meldung in dieser Form an.
XAudio2: WARNING: Spent Xms in audio thread; XAudio2 possibly overloaded
In der Regel tritt diese Meldung mit der nächsten Nachricht auf.
Wenn dem Audiotreiber nicht rechtzeitig neue Audiodaten zugeführt werden können, zeigt XAudio2 eine Meldung in dieser Form an.
XAudio2: WARNING: Glitch at output sample X
Der Aufruf von IXAudio2::GetPerformanceData stellt XAudio2-Leistungsdaten bereit, einschließlich der Gesamtzahl der Störungen seit dem Start der XAudio2-Engine.
Ansätze zum Beheben von Problemen
Mögliche Möglichkeiten, Um Audiostörungen zu reduzieren, sind die folgenden:
Im Fall des Sprachmangels: Erhöhen Sie die Menge der Audiodaten, die vor einer Stimme in die Warteschlange eingereiht werden. Sie können IXAudio2SourceVoice::GetState verwenden, um die Anzahl der Puffer zu ermitteln, die jederzeit in die Warteschlange gestellt werden. Wenn sie weiterhin Fehler bei der Sprachstarrung sehen, aber keine Störung hören können, stellen Sie sicher, dass Sie XAUDIO2_BUFFER festlegen. Flags zum XAUDIO2_END_OF_STREAM für den endgültigen Puffer eines Sounds. Dies weist XAudio2 darauf hin, dass keine weiteren Puffer notwendigerweise verfügbar sind, sobald dieser abgeschlossen ist.
In den anderen Fällen:
- Reduzieren Sie die Anzahl der aktiven Stimmen und Effekte im Diagramm, insbesondere teure Effekte wie Hall.
- Deaktivieren Sie Stimmen und Effekte, die Sie nicht verwenden.
- Verwenden Sie nach Möglichkeit die Flags XAUDIO2_VOICE_NOSRC und XAUDIO2_VOICE_NOPITCH in IXAudio2::CreateSourceVoice. Die Konvertierung der Abtastrate ist teuer.
- Verringern Sie die Abtastrate einzelner Stimmen. Beispielsweise kann eine Submix-Stimme, die einen Halleffekt hosten, eine niedrigere Abtastrate aufweisen als die Quellstimme, die an sie sendet. Geräusche wie Explosionen und Schüsse, die keine hohe Genauigkeit benötigen, können auch mit niedrigeren Abtastraten aufgezeichnet werden.
- Stellen Sie sicher, dass Rückrufimplementierungen so wenig Arbeit wie möglich erledigen und niemals blockieren.
- Führen Sie weniger Aufrufe an XAudio2 aus. Audioparameter müssen in der Regel nicht für jeden Videoframe aktualisiert werden. Alle 30 ms sind ausreichend. Sie sollten redundante Aufrufe vermeiden, z. B. das Festlegen des Volumes mehrmals in schneller Folge.
- Reduzieren Sie die CPU-Gesamtauslastung des Spiels.
Zugehörige Themen