Debug di glitch audio in XAudio2
Glitch possono verificarsi in XAudio2, questo argomento illustra come vengono segnalati e alcuni approcci per risolverli.
Questa panoramica illustra gli argomenti seguenti:
- Cause dei problemi di output audio o degli errori
- In che modo XAudio2 segnala i problemi
- Approcci per risolvere i problemi
- Argomenti correlati
Cause dei problemi di output audio o degli errori
Glitch possono verificarsi nell'output XAudio2 per diversi motivi.
- Una voce di origine XAudio2 è starved. Il client non invia un audio fresco abbastanza veloce. Si ottiene il silenzio perché non ha dati da riprodurre.
- XAudio2 nel suo complesso è sovraccaricato. Richiede più tempo di X ms per produrre X ms di audio. Si ottengono dropout perché XAudio2 non è in grado di produrre dati quanto più velocemente del dispositivo audio necessario. È possibile che vengano eseguite troppe voci o effetti alla volta, eseguendo troppe operazioni nei callback XAudio2 o eseguendo chiamate API XAudio2 troppo frequentemente.
- Il thread di elaborazione audio è in stallo perché l'implementazione del client di un callback XAudio2 sta eseguendo operazioni che possono bloccare il thread. Ad esempio, potrebbe accedere al disco, sincronizzare con altri thread o chiamare altre funzioni che possono bloccare. Usare un thread in background con priorità inferiore che il callback può segnalare per eseguire tali attività.
- Il sistema nel suo complesso viene sovraccaricato. Altri thread in esecuzione con la stessa priorità o maggiore di XAudio2 stanno eseguendo troppo lavoro. Sono in competizione con il thread audio per il tempo della CPU.
In che modo XAudio2 segnala i problemi
XAudio2 può comunicare glitch nella compilazione di debug in diversi modi.
Se una voce è in corso, XAudio2 mostra un messaggio in questo formato.
XAudio2: WARNING: Voice at 0xNNNNNNNN starved: no more source buffers are available, but no end-of-stream marker was received
Se il thread audio viene eseguito per troppo tempo, XAudio2 visualizza un messaggio in questo formato.
XAudio2: WARNING: Spent Xms in audio thread; XAudio2 possibly overloaded
In genere, questo messaggio si verifica con il messaggio successivo.
Se il driver audio non può essere alimentato in tempo a nuovi dati audio, XAudio2 visualizza un messaggio in questo formato.
XAudio2: WARNING: Glitch at output sample X
La chiamata a IXAudio2::GetPerformanceData fornisce dati sulle prestazioni XAudio2, incluso il numero totale di errori dall'avvio del motore XAudio2.
Approcci per risolvere i problemi
I modi possibili per ridurre gli errori audio includono quanto segue.
Nel caso della starvazione vocale: aumentare la quantità di dati audio in coda su una voce. È possibile usare IXAudio2SourceVoice::GetState per individuare il numero di buffer accodati in qualsiasi momento. Se vengono ancora visualizzati errori di starvazione vocale, ma non è possibile sentire alcun problema, assicurarsi di impostare XAUDIO2_BUFFER. Contrassegni per XAUDIO2_END_OF_STREAM sul buffer finale di un suono. Ciò indica a XAudio2 di non aspettarsi più buffer necessariamente disponibili non appena questa operazione viene completata.
Negli altri casi:
- Ridurre il numero di voci e effetti attivi nel grafico, soprattutto gli effetti costosi come il riverbero.
- Disabilitare le voci e gli effetti che non si usa.
- Usare i flag di XAUDIO2_VOICE_NOSRC e XAUDIO2_VOICE_NOPITCH in IXAudio2::CreateSourceVoice, ogni volta che è possibile. La conversione della frequenza di esempio è costosa.
- Ridurre la frequenza di esempio delle singole voci. Ad esempio, una voce submix che ospita un effetto riverbero può avere una frequenza di esempio inferiore rispetto alla voce di origine che lo invia. Suoni come esplosione e colpi di pistola che non necessitano di alta fedeltà possono essere registrati anche a tassi di campionamento inferiori.
- Assicurarsi che le implementazioni di callback funzionino il meno possibile e non bloccano mai.
- Effettuare meno chiamate a XAudio2. I parametri audio in genere non devono essere aggiornati per ogni fotogramma video. Ogni 30 ms o così via è sufficiente. È consigliabile eliminare chiamate ridondanti, ad esempio l'impostazione del volume più volte in successione rapida.
- Ridurre l'utilizzo complessivo della CPU del gioco.
Argomenti correlati