相変わらず、AVRスプライトのスクロールプログラムです。
昨日寝る前にプログラムを眺めていたら、間違えを見つけて
しまいました。
しかもそれほど単純じゃなく、またしても処理時間が長くなる
ようなお話。
うーん、こまった。
と思って、どう直せばいいかを少しだけ考えてみるために、
ソースを眺めてみたところ…
あれ?なんでこんな処理しているんだろう?って疑問を
感じちゃう部分が。
ある数値を8で割って、それをその少し下で8を掛けて
いるんですよ。
同じ数を割って掛けるという必要は無いはずなのに…。
(下位3ビットの処理は別途考慮が必要だとしても)
そう思って、それぞれの計算式の意味を調べてみると、
・8で割る意味
→1キャラクターは縦8ドットなので、キャラクタ数単位
のY座標を求めるために8で割る
・8掛ける意味
→横方向は1行あたり16キャラクターだが、1バイト
あたり2キャラクターなので、結果1行あたり8バイト。
なのでY座標を8倍するとVRAM上のアドレスが求まる
といった具合。なるほど。それぞれに意味はあるんだな!
設計どおりのプログラムになっているので可読性が高く、
仕様変更するなどは都合が良いんだけども、ただ、ループの
最も内側なんだし、もっと最適化したロジックにしないと
処理時間に影響大だから、ここは見直しが必要だな…
それ以外にも探してみると、数値の範囲が127以下しか
ない数値をバカ正直に16ビット幅で処理していたり…。
(1命令ですみそうなことを、10倍以上の手間掛けて
処理しております…バカだなぁ…)
そこらへんを見直したら、もしかしたら大幅に処理時間を
短縮できそうだなぁ!
見直しの観点だけ忘れないようにメモしておいて、あとは
時間が有る時に考えることにしよう。
それにしても、思わぬ収穫でした…
|