小数点キャストとの戦い

 はてさて、

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

で、これが猛烈に重いわけですね(汗)

 後は、

単純に余剰(%)を使っているので、

これも毎回呼ぶとなるとかなり重いです。

ただ、読んでいる回数・一回あたりのコストを考えると、

とりあえず、前者のキャストの方を何とかすべきか。





 …というわけで調べていたら、

こんなのを発見。



………えっと、コレで解決ですか?(苦笑)





(実際変更した上での検証は次回で)




*1:基本的には整数倍の周波数のみだけど、
ほとんどコストなしでFMがかけられると言う代物。
ただし、前もってMMLの関数で指定する必要アリ。

*2:固定小数点数を使う」という手もあったんですが、
精度が2^-nになってしまうので少し扱いづらいということと、
実装当初はあんまり問題になっていなかったのでこのまんまでした(汗)