ああ、なんつーか、これダブルバッファリングって言うのかなぁ。
使い方は簡単でSetDoubleBufferingでダブルバッファリングを使いたいタイミングを指定しておく。 指定するフラグはView.hの上の方にB_UPDATE〜ってのがあるから、その組みあわせ。
それをやっておくと、Drawが呼ばれて再描画される時に、Drawが完全に呼び終わるまで画面が更新されない。 Drawの途中経過は見えないのだ。
まあ、それだけ聞くとちらつき回避によさげだけど、実際は結構馬鹿な動作をしてくれる。
Drawの処理が終わるまで画面更新がないわけで、たとえばB_UPDATE_EXPOSEとかを使うとよくわかるんだが、Viewの上を他のウィンドウを通過させるとそのウィンドウがいつまでもViewに残ることになる。 Drawが軽ければたぶん気にならないけど、Vimみたいに重いとはっきりわかる。特にダブルバッファリングかけてないViewと比較するとあきらか。 しかもDrawが軽ければダブルバッファリングする意味ないんだよな。
自前ダブルバッファリングは重すぎた。システムのダブルバッファリングはなんか違う気がする。ではどうするか。
重いのは文字描画とスクロールかな。 まあスクロールはそれほどではないんだけど、それでも重い方だと思う。 文字描画はしかたない。日本語固定ピッチフォントが無い限り、これ以上処理を省くのは難しそうだ。
スクロールが重いのはCopyBitsで実現しているせいだと思う。ウィンドウがでかければ重くなる。 文字描画はしかたないが、レスポンスを良くすることで重い感じを軽減するのと、一文字ずつの描画が見えるのをなるべく一括で描画するようにするので対処できないかと思う。
実装は基本的に自前ダブルバッファリング。 ただ、ビットマップでダブルバッファリングをすると重いのでBPictureを使おうかと思う。
Vim側から描画要請が来たらまず画面管理スレッドに投げる。 画面管理スレッドは画面バッファを更新して描画スレッドに投げる。 描画スレッドは画面バッファの通りにBPictureを作成。 描画スレッドはできたBPictureをViewに投げる。 Viewは受けとったらDrawPictureで描画。
まあ、なんてBeらしいスレッディングなんでしょう。 あとは実験してみて本当に上手く動くのかだな。 動かないことはないだろうけど、実は重かった、なんてこともありえるし。
何はともあれ、方針が決まってみただけでも進展ありか。
ゲームしてぇよ。
日曜はゲームマーケット行こうと思ったのに、仕事に呼び出された。 今日はせっかくイエサブ行ったのにR&R買い忘れてた。
最近ゲームしたいです。特にシャドウラン。
やれそうにないので小説でも書きたいですな。んな暇ないですが。
適当に小説っぽいのを挟みつつチュートリアルでも書いてみるのが良いのか。 3rdにチュートリアルを書きたいもんな。
ああ、量書けたら同人誌にでもすりゃいいのか。 ひさびさにDTPもどきでもして遊びたい気分。Macも買うし。 むぅ。InDesignとかIllustratorとかフォントが欲しくなるではないですか。
ところではるか昔に話題になった4thって出ないのかなぁ。 ParanoiaXPなんてのが出るらしいけど。