XAudio2 でのオーディオ エラーのデバッグ
XAudio2 でグリッチが発生する可能性があります。このトピックでは、それらがどのように報告されるかと、それらを修正するためのいくつかのアプローチについて説明します。
この概要では、次のトピックについて説明します。
オーディオ出力の問題またはグリッチの原因
いくつかの理由により、XAudio2 出力でグリッチが発生する可能性があります。
- XAudio2 ソース音声が枯渇しています。 クライアントは、新しいオーディオを十分に速く送信していません。 再生するデータがないため、無音になります。
- XAudio2 全体として負荷が高い。 オーディオの X ms を生成するには 、X ms より長い時間がかかります。 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 使用率を減らします。
関連トピック