私はリアルタイムでオーディオをミキシングしている C++ のクロスプラットフォーム プロジェクトを持っています。ディスク上の個別のファイルから読み取る、入力としていくつかの独立したトラックがあります。次に、これらをミックスし、何らかの処理を適用して、結果のオーディオをバッファに吐き出します。私が抱えている問題は、ディスク IO 速度の問題です。現在実行中のテストでは、ディスクから同時に読み取られる約 10 のトラックがあります。各トラックは生の PCM、48000 HZ 16 ビット ステレオです。これは、可能な限り迅速に読み取る必要がある大量のデータがあることを意味します。Boost を使用して単純な fread 呼び出しとメモリ マップ ファイルの両方を試しましたが、問題は同じです。ファイルが最初に開かれると、通常はオーディオが分割されます (おそらく、ファイルが OS によってキャッシュに読み込まれる間)。その後、すべてが問題なくスムーズに実行されます。当分の間、一般的なケースではファイルごとに 1 つのスレッドを使用しますが、スレッドごとに 2 つのファイルを使用することもあります。通常、ストリームの停止/分割が発生するのは、スレッドごとに 2 つのファイルがある場合です。これはユーザーによって制御されるため、再生する必要がある入力ファイルを事前に知らないことに注意してください。したがって、私の問題は、これらの初期ブロックをどのように読み取って、失速/分裂しないようにするかです。また、新しいファイルがロードされたときに、最初から読み取りを開始する必要があるとは限りません。したがって、私の問題は、これらの初期ブロックをどのように読み取って、失速/分裂しないようにするかです。また、新しいファイルがロードされたときに、最初から読み取りを開始する必要があるとは限りません。したがって、私の問題は、これらの初期ブロックをどのように読み取って、失速/分裂しないようにするかです。また、新しいファイルがロードされたときに、最初から読み取りを開始する必要があるとは限りません。
私はいくつかの考えを持っています:
起動時にすべてのファイルを一度に読み取り、データを無視することで、ファイルをキャッシュにプリフェッチできますか? すべてをメモリに保存することはできません。しかし、特にこれはクロスプラットフォームであるため、OS の読み取りキャッシュの内部動作に依存するのは良くないようです。
圧縮に Ogg Vorbis などの形式を使用し、圧縮されたデータを完全にメモリにロードして、オンザフライでデコードできますか? 10 以上の Vorbis ストリームをデコードすると CPU に負荷がかかりすぎるのではないかと考えていますが、まだベンチマークはありません。少なくともこの方法で、I/O バウンドのタスクから CPU バウンドのタスクに変更します。
大量の読み取りがより均等に分散されるようにするために、他の種類の巧妙なバッファリング アプローチを行うことはできますか? どうすればそれを達成できるかについて、私はほとんど知りません。
私はこの時点で立ち往生しており、スループットを改善する可能性のある提案をいただければ幸いです。