30日OS自作本26日目
26日目の内容になります。
GUI描画の最適化とコンソールの昨日の強化、コマンドを3つ作ります。
GUI描画の最適化
harib23a(透明色の判定)
透明色を判定しているif分が非効率なのでこれを改善します
for(/*シート分*/){ for(/*y幅分*/){ for(/*x座標分*/){ if(){/*透明色用の処理*/} //←これ効率悪い!!!!! } } }
透明色がないシートの場合でもy幅分 * x幅分 if 文をとってしまうのが無駄です。 harib23aでは透明色ありのシートとなしのシートでfor文を変えてしまうことで高速化を期待します。
for(/*シート分*/){ if(/*透明色なしのシート*/){//この条件を追加!!! for(/*y幅分*/){ for(/*x座標分*/){ //透明色判定を省略したVRAM書き込み } } }else{ for(/*y幅分*/){ for(/*x座標分*/){ if(){/*透明色用の処理*/} } } } }
全てのシートが透明色をもつシートの場合は、通る余分なif文が一つ増えるので速度が落ちてしまいますが、 マウスぐらいしかないので
harib23b(一度の書き込みを1Bから4Bへ)
VRAMへの書き込みは*char型のポインタを利用するので1Bずつですが、
//unsigned char *map;
map[vy * ctl -> xsize + vx] = sid;
こちらをint型(4B)にします。
p = (int *) &map[vy * ctl->xsize + vx]; //注:ループ上限のbx1はbxの役1/4になる様に設定されている for (bx = 0; bx < bx1; bx++) { p[bx] = sid4; }
これでループ回数を役1/4に減らすことができます。 かなり早くなりそうですが。。。
harib23c(sheet_refreshsubも4B書き込み対応に)
画面全体ではなく指定したシートのみを更新するsheet_refreshsub()
も4B書き込みに対応させます。
harib23d
FIFOが空っぽになった時に描画するという変更を入れます。 こちらの変更で、手元でマウスを止めたがカーソルが移動し続けているという事象を回避できる様ですが、いまいち違いがわかりませんでした。
ウインドウ機能の強化
- コマンドの追加
- start:新規ウインドウを開く
- exit:ウインドウを閉じる
- ncst:マルチタスクでアプリを起動させる
ncstはbashで言う所のコマンド末尾に&
をつける様な動作です。
感想
今回はちょっとしたリファクタリング中心であまり新しい技術要素が出て来なかった様に思います。特にスピードアップに興味がない方は描画の改善は飛ばしてもいい気がします。 次回はLDTを使います。これも「はじめて読む486」に書いてあって気になっていた内容なので楽しみです。