個人用雑記

勉強したことを書いていければなーと

30日でできる!OS自作入門(Day 11)

ついにウィンドウ

らしいです、GUI(というよりはそういう感じの見た目)はやっぱり説得感が全然違いますよね。

の前にマウスの続きをちょっと

昨日まででほとんど完成したマウスでしたが、Windowsなんかではよくやる画面の端ギリギリまでマウスを持っていくやつができませんね。これは描画をマウスの右端が画面の端とぶつかるまでしか行わないようにしているからで、マウスの左端がぶつかるまで行えば解決しそうです。
が、それだけでは解決しません。これは、人の目には画面は縦横で構成された二次元のように見えますが、実際はi一次元配列と同じで、右端(例えば[0][319])のさらに右横は一段下の左端([1][0])になるからです。これでは右端まで持っていった場合画面外にあるマウスが左側に描画されることになってしまうわけです。
しかし、昨日の下敷きのおかげで解決は簡単で、描画範囲の計算時に画面買いになったらその部分を描画しなければいいだけです。下敷きがさっそく効いてきましたね。

コードを考えている間は画面外に出てはいけないからマウスの右端までで考えようとなりがちだと思いますが、実際にやってみると課題が見えてきたりするものですね。

ウィンドウを描画する

満を持してのという感じですね。とはいえ11日目にしてもうウィンドウが描画されているの、やばいですね。
とりあえずウィンドウのサイズを適当に決めて下敷きとして1枚もらい、それっぽくなるように色を塗り(ここが重要)、マウスの下に配置します。このウィンドウはまだ動かず、消せもしないものですけど、迫力は段違いですね。 今回ばかりは普段ソースコード部分を流し読みで満足し、デモ写真を見るだけの自分でも、PC上で動かしました。 f:id:rei_624:20200224232917p:plain
いつの間にこんなカラフルでパソコンっぽい画面(バカっぽい発言)になっていたんだ・・・

動きのあるウィンドウ

さっきのは文字を表示したままだったので何も変化がなく、味気ないですよね。そこでカウンターでずっと数を足し続けながら描画するウィンドウを考えてみます。すると、すぐに現在の描画方法の欠点が出てきます。描画する度に背景がチラチラ見えてしまうのです。
これは先日までで必要な範囲だけの描画にはなったものの、その範囲は毎回背景から全て描画しているのが原因です。そこで、描画しなおすウィンドウと、その下敷きより上にある下敷きのみ再描画させれば解決できそうと考えられますが、それだけでは別のチラチラが発生します。

描画って難しいんですね、やっぱり。

さて、このチラチラの原因は再描画する必要が出た下敷きより上”全て”を再描画している点です。例えばマウスは動かしてないのにその下のウィンドウを再描画するからマウスも毎回再描画していたら、チラチラしそうですよね。これを回避するにはどうあがいてもマウスやほかのウィンドウを「よけて」描画しなければなりません。
本では描画用の配列と全く同じサイズの配列を用意して、一番上に来る下敷きの番号を格納させています。確かに、こうすればある画面の1点に対してそこで描画すべきウィンドウがどれかすぐわかりますね。そして、再描画する範囲で回したループ内でその部分の下敷きの番号が再描画する下敷きと同じ場合のみ再描画すればマウスを「よける」という動作が達成できそうですね。
確かにこの方法であれば実装は楽ですが、消費メモリが気になるところですね・・・int型だと1920*1080描画には8MB、short型を使っても4MBかかってしまいます。だからといっていい方法が思いついているわけではないのですが。

Day12へ

明日からはついにウィンドウを卒業してタイマです。
OSからしてもめちゃめちゃ重要な分野ですね。残念ながら使用しているタイマはずいぶん古いものになってしまいましたが・・・