Debuggen von Audiostörungen in XAudio2
In XAudio2 können Störungen auftreten. In diesem Thema wird erläutert, wie sie gemeldet werden, und es werden einige Ansätze zur Behebung beschrieben.
In dieser Übersicht werden die folgenden Themen behandelt:
- Ursachen von Audioausgabeproblemen oder -störungen
- Wie XAudio2 Probleme meldet
- 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 nicht schnell genug neue Audiodaten. Sie erhalten Ruhe, da keine Daten wiedergegeben werden müssen.
- XAudio2 als Ganzes ist überlastet. Es dauert länger als X ms, X ms Audio zu erzeugen. Sie erhalten Auslassungszeichen, 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 durch.
- Der Audioverarbeitungsthread wird angehalten, da die Clientimplementierung eines XAudio2-Rückrufs Dinge tut, die den Thread blockieren können. Beispielsweise kann er auf den Datenträger zugreifen, mit anderen Threads synchronisieren oder andere Funktionen aufrufen, die blockieren können. 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 einer höheren Priorität als XAudio2 ausgeführt werden, führen zu viel Arbeit aus. Sie konkurrieren mit dem Audiothread um CPU-Zeit.
Wie XAudio2 Probleme meldet
XAudio2 kann Störungen im Debugbuild auf verschiedene Weise 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 receivedWenn der Audiothread zu lange ausgeführt wird, zeigt XAudio2 eine Meldung in diesem Format an.
XAudio2: WARNING: Spent Xms in audio thread; XAudio2 possibly overloadedIn der Regel tritt diese Meldung mit der nächsten Nachricht auf.
Wenn dem Audiotreiber keine neuen Audiodaten rechtzeitig zugeführt werden können, zeigt XAudio2 eine Meldung in diesem Format an.
XAudio2: WARNING: Glitch at output sample XDer Aufruf von IXAudio2::GetPerformanceData stellt XAudio2-Leistungsdaten bereit, einschließlich der Gesamtzahl von Störungen seit dem Start der XAudio2-Engine.
Ansätze zum Beheben von Problemen
Folgende Möglichkeiten zum Reduzieren von Audiostörungen sind möglich.
Im Fall des Sprachmangels: Erhöhen Sie die Menge der Audiodaten, die auf einer Stimme in die Warteschlange eingereiht werden. Sie können IXAudio2SourceVoice::GetState verwenden, um die Anzahl der Puffer zu ermitteln, die zu einem beliebigen Zeitpunkt in die Warteschlange eingereiht werden. Wenn weiterhin Sprachhungerfehler auftreten, aber keine Störung zu hören ist, stellen Sie sicher, dass Sie XAUDIO2 _ BUFFERfestlegen.Flags für XAUDIO2 _ END OF STREAM im _ _ endgültigen Puffer eines Sounds. Dies weist XAudio2 an, nicht mehr Puffer zu erwarten, die 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 _ _ NOSRC- und XAUDIO2 _ VOICE _ NOPITCH-Flags in IXAudio2::CreateSourceVoice. Die Konvertierung der Stichprobenrate ist teuer.
- Reduzieren Sie die Abtastrate einzelner Stimmen. Beispielsweise kann eine Submix-Stimme, die einen Halleffekt hostet, eine niedrigere Abtastrate aufweisen als die Quellstimme, die an sie sendet. Sounds wie Explosionen und Schütze, 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 leisten und niemals blockieren.
- Nehmen Sie weniger Aufrufe an XAudio2 vor. Audioparameter müssen in der Regel nicht für jeden Videoframe aktualisiert werden. Alle 30 ms ist ausreichend. Sie sollten redundante Aufrufe vermeiden, z. B. das mehrmalige Festlegen des Volumes in schneller Folge.
- Reduzieren Sie die cpu-Gesamtauslastung des Spiels.