小数点キャストとの戦い
はてさて、
FMの音を作るのがおもしろいのはいいんですが、
どんどん重くなっていくわけですよ…。
これではイカンということで、
明らかに一番負荷がかかっている
波形の計算・書き込み部分
の高速化を図る。
…で、一体何が重いんだろうか?
以下、コードの一部。
一応、軽い解説を入れると、
/* 緑は「浮動小数点数」
下線部は「おそらくネックになっている部位」 */
data = (short)( (double)wave_buf[
address[(int)(set_pos +mod_ad[i]) % buf_len]
]
* l_pan * op->env_lv *fm_env );
「set_pos 〜 buf_len」のあたりで「どの辺の値を拾ってくるか」を計算しています。
直接「wave_buf」で参照しないのは、
昔使っていた簡易FM*1の名残です。
右の方の浮動小数点数群は単なる音量調整(要するに「ボリューム」)です。
…というわけで、
整数と小数が同居しています。
しかも、肝心の波形データは「整数」なわけですから、
どうあがいても「小数 → 整数のキャスト」が必要になります。*2
で、これが猛烈に重いわけですね(汗)
後は、
単純に余剰(%)を使っているので、
これも毎回呼ぶとなるとかなり重いです。
ただ、読んでいる回数・一回あたりのコストを考えると、
とりあえず、前者のキャストの方を何とかすべきか。
…というわけで調べていたら、
こんなのを発見。
………えっと、コレで解決ですか?(苦笑)
(実際変更した上での検証は次回で)