BayGUIの話

ためしにサーバーに点描画メッセージを1万回投げてみた・・とてつもなく時間が掛かった。


MonaFormsはどうやっているか見てみた・・共有メモリをこれでもかというくらい使いまくっていた。


共有メモリを使いまくると移植性が極端に落ちる・・諸刃の剣だった。


BayGUIは各プロセスが勝手に描画を行う。ウィンドウ間は非活性やアイコン化でなんとか平衡を保っている。一見危ういが、メッセージを投げる代わりに関数呼び出しに書き換えるとマルチプロセスのものが割とすんなりシングルプロセスになる。裏ウィンドウの描画はかなり深刻な問題だなぁ。


ひらめいた

  • まず各ウィンドウはオフスクリーンに描画する。
  • ウィンドウマネージャに自分の上にある領域をすべてもらう。
  • 領域の数が0個ならクリッピングせずオフスクリーンをオンスクリーンにそのまま転送する。
  • 領域の数が複数なら左上の点から順に自分より上の領域と重ならないかチェックする。
  • どれとも重なっていなかったらオンスクリーンに転送する。
  • ウィンドウがいっぱいかさなっていると結構時間がかかりそうだけどサーバーに投げるよりはましだろう。
 bool contains(x, y, rect) {
   // hogehoge
 }
 
 bool contains(x, y, rectList) {
     for (int i = 0; i < rectList.size(); i++) {
       if (contains(x, y, rectList[i]) == true) return true;
     }
     return false;
 }
 
 for (int y = 0; y < width; y++) {
   for (int x = 0; x < height; x++) {
     if (contains(x, y, rectList) == false) setPixel(x, y);
   }
 }