對 XAudio2 中的音訊問題進行偵錯
在 XAudio2 中可能發生問題,本主題涵蓋其回報方式,以及修正問題的一些方法。
本概觀涵蓋下列主題:
音訊輸出問題或問題的原因
XAudio2 輸出中可能會因為數個原因而發生問題。
- XAudio2 來源語音已耗盡。 用戶端未將全新音訊提交到它的速度夠快。 因為沒有要播放的資料,所以您會無聲。
- XAudio2 整體已過度負擔。 產生音訊的 X毫秒需要超過X毫秒的時間。 因為 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::CreateSourceVoice中的XAUDIO2_VOICE_NOSRC和XAUDIO2_VOICE_NOPITCH旗標。 取樣率轉換成本很高。
- 減少個別語音的取樣率。 例如,裝載殘響效果的副混音可能會有比傳送至它的來源語音較低的取樣率。 不需高精確度的暴增和射擊之類的音效也可以以較低的取樣率錄製。
- 請確定回呼實作盡可能不執行任何工作,且永遠不會封鎖。
- 對 XAudio2 進行較少的呼叫。 音訊參數通常不需要針對每個視訊畫面更新。 每 30 毫秒以上就已足夠。 您應該消除重複呼叫,例如快速連續設定磁片區數次。
- 減少遊戲的整體 CPU 使用量。
相關主題