10日目 重ね合わせ処理
1. メモリ管理の続き
メモリの管理を0x1000バイト単位で管理することにする。
切り上げはどうするかというと、and演算を使う。i = i & 0xfffff000 とすれば、0x1000以下の数字を切り捨てられるので改造して、
i = (i + 0xfff) & 0xfffff000 とすれば切り上げられる。
・切り上げ、切り捨てはAND演算でできる
2. 重ね合わせ処理
レイヤを複数重ね合わせるようにして画面表示することを考える。
一番上のレイヤにマウスカーソルを描いて、一番下のレイヤにデスクトップ壁紙を用意する。マウスカーソルの移動はレイヤごと移動させる。
レイヤの情報を構造体にまとめる。
・レイヤの大きさ
・レイヤの位置
・透明色番号(?)
・レイヤの高さ
・フラグ(?)
このレイヤたちを管理する構造体も作成する。
レイヤのそのものと、レイヤのアドレスを表示順に並べたものを持っておくことにする。
あと用意した関数は、
・メモリを初期化、確保する関数
・レイヤの大きさやバッファをセットする関数
・レイヤの高さを設定する関数
・レイヤを順番通りに表示し直す関数、リフレッシュ
・レイヤを移動させる関数
・使い終わったレイヤを解放する関数
・メモリの確保、解放を逐一するのでプログラムが巨大になる
3. 重ね合わせ処理の高速化 (1)
4. 重ね合わせ処理の高速化 (2)
レイヤのリフレッシュの際に、変化していない画素も含めて全ての画素を変更しているので時間がかかる。
指定した範囲内の画素のみを変化させるように関数を変更する。
いいかんじ。