https://www.3delite.hu/Object%20Pascal%20Developer%20Resources/BASSThreadedMixerLibrary.html
BASS_MIXER をマルチスレッド化するライブラリがあるようです。
サイトではASIOに出力といったことしか書かれていませんでしたが、パッケージのヘッダを見る限りでは出力を選ばない模様。
後日、試しに組み込んでみようと思います。
Rev. 166128a5cece38658cb750f35e542bd5c07ec06a で、TimeStretch=OFFの時に限り、ミキシング負荷を従来の半分にした。
従来は読み込むサウンド(xPolyphonicSounds)分だけテンポ変更のストリームを生成し接続していたが、これの負荷が相当大きかった模様。
(再生速度がx1.000の時はテンポ変更ストリームを通さないようにしていたつもりだったが、結局通るだけ通っていて、通した結果が破棄されていた。そのためまるで負荷軽減になっていなかった。)
Rev. 42c16e85b954490a96885f573abff135cecdfae8 でミキシング処理の並列化を行いました。CPUのコア数分だけ並列化を行います。
BASSmix 2.4.11がこの並列化処理に対応したため、その機能を使っています。 BASS.NET はこれに対応していませんでしたが、BASS.NETが定義している enum値ではなく直接この機能のAttribute値を設定することで対応しています。
これにより、FPSが10%~20%程度向上しました。(私の環境で、180fps→200~220fpsくらいになった)
なお、従来はチップ音を曲の進行に合わせて逐次ミキサーに登録したり削除したりしてミキサーに登録しているチップの数をある程度小さくしないとミキサー処理の負荷が大きすぎて出音そのものがガタガタになっていました。特にギター譜面で。
それが、今回の並列化により、このような動的なミキサーへの登録を行わずに、最初にどかっとまとめて全チップ音をミキサーに登録してしまっても問題ないレベルの負荷になりました。(CPU負荷は上がるが、従来に比べると微増といっていいレベル。)
ミキサーへの追加削除の処理は結構重かったので、そのタイミングで譜面ががたつく場合もありましたが、それをなくせます。
今はまだその設定をいじるUIを用意してはいませんが、Config.xmlには昔からその設定があるので、これまでのバージョンで一気にチップをミキサーに登録するとどうなるかは下記の項目をいじることで確認いただけます。
これをtrueからfalseにしてください。(後日CONFIGURATIONのUIで変更できるようにします)
あと、ギター/ベースの同時発音数を1に絞っていましたが、これも元のように増やしても(ドラムと同じように4にしても) 問題なさそうでした。これも後日、ドラムとは別に同時発音数を設定できるようにしようと思います。
https://osdn.net/users/yyagi/pf/DTXMania_TestBuilds/dl/DTXMania/DTXManiaGR_MultithreadedMixing.zip
試作版です。効果が気になる方はどうぞお試しください。
Release119に更新を適用済みです。チケットをクローズします。
ミキシング処理の並列化について、他の関連コミットは以下の通りです。 (DynamicMixerのon/off UIや、PolyphonicSoundsGBの追加、BASSThreadedMixerLibrary関連コードの削除など)
現在、性能のボトルネックは、WASAPI/ASIO使用時の BASS_MIXER です。ドラムの曲データはそれほど問題になりませんが、ギター曲だと顕著に出ます。
何とか負荷低減できないものか。