BSound使用時のウエイト回避案

STATUS: 故障中

 processingの標準のサウンド機能(BSoundクラス)を使うと、再生時に数百ms単位でウエイトが発生することがあります。
 これではゲームに使えません。
 (ゲーム開始時に1度だけ再生開始すればよいBGM等には問題は無い)

 しかしながら実際、BSoundを使用している個所をみると大抵次のようにかかれています。

 stop( se );
 play( se );
 ※ se は BSoundのインスタンス

 上記のようなコードになるのは、一度再生(play)したあとは、再生が続いている・いないに関わらず停止(stop)をしないと、次の再生が出来ないためです。
 これに対し、試しに停止と再生を別にキーに割り当てて、別々に操作できるようにしたところ、再生直後に停止を行った場合のみウエイトが発生していることがわかりました。

 以上の事から回避案としては…
A) 再生中に次の再生が必要になった場合は無視する
 再生中を判定するメソッドは無いので、再生開始時刻を保持しておきそこから一定時間を再生中として判断する。
 再生されている時間の計算は、lengthメソッドで得られたデータ長をサンプリングレートで割る。

B) 一つの効果音に対して複数のBSoundインスタンスを用意する
 複数のBSoundインスタンスに同一の音声ファイルをロードしておき順番に使用する。
 最初のインスタンスでの再生が完了する前に1順してしまうと、やはりウエイトが発生してしまうので、A)案と併用する。

コメント