Dela via


Felsöka ljudfel i XAudio2

Glitches kan inträffa i XAudio2, det här avsnittet beskriver hur de rapporteras och några metoder för att åtgärda dem.

Den här översikten beskriver följande avsnitt:

Orsaker till problem med ljudutmatning eller ljudstörningar

Buggar kan uppstå i XAudio2-utdata av flera orsaker.

  • En XAudio2-källröst är utsvulten. Klienten skickar inte nytt ljud till den tillräckligt snabbt. Du får tystnad eftersom det inte finns några data att spela upp.
  • XAudio2 som helhet överbelastas. Det tar längre tid än X ms att producera X ms av ljud. Du får avbrott eftersom XAudio2 inte kan generera datan så snabbt som ljudenheten behöver den. Du kanske kör för många röster eller effekter åt gången, utför för mycket arbete i XAudio2-återanrop eller gör XAudio2 API-anrop för ofta.
  • Ljudbearbetningstråden stannar eftersom klientens implementering av vissa XAudio2-återanrop gör saker som kan blockera tråden. Den kan till exempel komma åt disken, synkronisera med andra trådar eller anropa andra funktioner som kan blockeras. Använd en bakgrundstråd med lägre prioritet som återanropet kan signalera för att utföra uppgifter som dessa.
  • Systemet som helhet är överbelastat. Andra trådar som körs med samma eller högre prioritet än XAudio2 utför för mycket arbete. De konkurrerar med ljudtråden om CPU-tid.

Så rapporterar XAudio2 problem

XAudio2 kan kommunicera problem i felsökningsversionen på flera sätt.

  • Om en röst svältas visar XAudio2 ett meddelande i det här formatet.

    XAudio2: WARNING: Voice at 0xNNNNNNNN starved: no more source buffers are available, but no end-of-stream marker was received
    
  • Om ljudtråden körs för länge visar XAudio2 ett meddelande i det här formuläret.

    XAudio2: WARNING: Spent Xms in audio thread; XAudio2 possibly overloaded
    

    Normalt sker det här meddelandet med nästa meddelande.

  • Om ljuddrivrutinen inte kan matas in med nya ljuddata i tid visar XAudio2 ett meddelande i det här formuläret.

    XAudio2: WARNING: Glitch at output sample X
    
  • Anrop av IXAudio2::GetPerformanceData ger XAudio2-prestandadata, inklusive det totala antalet glitchar sedan XAudio2-motorn startade.

Metoder för att åtgärda problem

Möjliga sätt att minska ljudproblem är följande.

  • Vid röstsvält: Öka mängden ljuddata som läggs i kö på en röst. Du kan använda IXAudio2SourceVoice::GetState för att ta reda på antalet buffertar som är köade vid varje givet ögonblick. Om du fortfarande ser röstsvältningsfel, men inte kan höra något fel, kontrollerar du att du ställer in XAUDIO2_BUFFER.Flaggor att XAUDIO2_END_OF_STREAM på den sista bufferten av ett ljud. Detta talar om för XAudio2 att inte förvänta sig att fler buffertar ska vara tillgängliga nödvändigtvis så snart som denna är klar.

    I andra fall:

    • Minska antalet aktiva röster och effekter i diagrammet, särskilt dyra effekter som reverb.
    • Inaktivera röster och effekter som du inte använder.
    • Använd flaggorna XAUDIO2_VOICE_NOSRC och XAUDIO2_VOICE_NOPITCH i IXAudio2::CreateSourceVoice, när det är möjligt. Omvandling av samplingsfrekvens är kostsam.
    • Minska urvalshastigheten för enskilda röster. Till exempel kan en röst i undermix som är värd för en reverbeffekt ha en lägre samplingsfrekvens än källrösten som skickar ljud till den. Ljud som explosioner och skott som inte behöver hög återgivning kan också registreras med lägre urvalshastigheter.
    • Se till att återanropsfunktioner gör så lite arbete som möjligt och aldrig blockerar.
    • Gör färre anrop till XAudio2. Ljudparametrar behöver vanligtvis inte uppdateras för varje videobildruta. Var 30:e ms eller så räcker det. Du bör eliminera redundanta anrop, till exempel att ställa in volym flera gånger i snabb följd.
    • Minska spelets totala CPU-användning.

felsökningsverktyg

programmeringsreferens för XAudio2