GUIサーバ高速化/07.修正案


Top / GUIサーバ高速化 / 07.修正案

07. 修正案

ひげぽんさんの修正案をベースに、詳細を煮詰めていきます。

ページが複雑に入り乱れたので、整理をかねて必要部分を抜き出します。

ひげぽんさんの修正案

出典: ../06.AWT調査後の方針/具体的に

  1. 【追加】Component::repaint(x, y, w, h)
    void Component::repaint(int x, int y, int w, int h)
    {
      if (this->_buffer == NULL) return;
      update(x, y, w, h);
    }
  2. 【追加】Graphics::drawImage(image, x, y, w, h, componentX, componentY)
    • 部分描画のためのメソッドを追加。
  3. 【修正】Component::update(x, y, w, h)
    • repaintから呼び出される
    • 追加した部分描画のdrawImage()を使用
      - c->getGraphics()->drawImage(this->_buffer, getX(), getY());
      + c->getGraphics()->drawImage(this->_buffer, x, y, w, h, getX(), getY());
      • ↑で(x, y)がローカル座標系を前提にしているため↓
    • グローバル座標系からローカル座標系に修正
      - c->update(c->getX() + c->getInsets()->left + x,
      -   c->getY() + c->getInsets()->top + y, w, h);
      + c->update(c->getX() + c->getInsets()->left + x + getX(),
      +   c->getY() + c->getInsets()->top + y + getY(), w, h);

座標系の混乱

出典: ../05.部分描画実装(libbaygui)/実装/コメント


baysideさんの見解

出典: ../05.部分描画実装(libbaygui)/方針

出典: ../05.部分描画実装(libbaygui)/変更点

出典: ../06.AWT調査後の方針

baysideさんへの質問 by Tino

  1. 「tx, ty, cx, cy, cw, ch メンバーを駆使」とありますが、これはクリッピング領域からdrawImage()の描画範囲を自動的に判断するのが望ましいということでしょうか?
    • 実際のAWTを使ってみて、私も同じ感想を持ちました。
      • 出典: ../05.部分描画実装(libbaygui)/実装/AWT/05
      • Graphicsの段階でクリッピングされているので、 drawImage()の内部でマスクして最適化されていれば、いちいちこんなコードを書く必要がないということに気付きました。
  2. 上記Bへの回答で将来的にクリッピングをサポートすると述べておられますが、1の対処法はこれの一部だと考えてよろしいでしょうか?
    • ソースをみたところGraphics::setClip()は存在するようですが、描画に影響を与えていないように見受けられました。

Tinoの見解

  1. drawImage()のAWTと矛盾するオーバーロード追加には反対です。もともとあるdrawImage()をクリッピング対応にすることが望ましいと思います。
  2. Component::update(x, y, w, h)はAWTと矛盾するので、廃止した方が良いと思います。
  3. ウィンドウ絡みの座標指定は、すべてウィンドウのローカル座標系に統一する方が良いと思います。具体的には以下をすべてローカル座標系にするべきだと思います。これをやるのは、アプリ側から使われていない今しかないと思います。
    1. DrawWindow()
    2. MSG_GUISERVER_DRAWWINDOW
    3. 【廃止?】Window::update(x, y, w, h)
    4. 【廃止?】Component::update(x, y, w, h)
    • DrawWindow()をローカル座標系にすると、それ以下のものすべてに影響を与えるので、修正はこの順番が望ましいでしょう。

以上の修正は、ひげぽんさんがスタンスに掲げられていることと同じように、 最小の手間で最大の効果を得ることを狙ったものです。 根本から作り変えるような大規模な改変になるという認識ではありません。

GUIサーバーのパッチ

DrawWindow()をローカル座標系に変更。 MSG_GUISERVER_DRAWWINDOWの座標系も自動的に追随する。

--- window.cpp.orig	2006-09-18 18:12:48.807268800 +0900
+++ window.cpp	2006-09-18 18:43:45.601288000 +0900
@@ -202,6 +202,8 @@
 	
 	if (!w->__internal2) CreationEffect(w);
 	
+	wx += w->X;
+	wy += w->Y;
 	DrawImage(screen_buffer, wallpaper, wx, wy, wx, wy, ww, wh);
 	_R r(wx, wy, ww, wh);
 	int size_w = windows.size();
@@ -239,7 +241,7 @@
 void DrawWindow(guiserver_window* w, bool draw_screen /*= true*/)
 {
 	if (w == NULL || w->FormBufferHandle == 0) return;
-	DrawWindow(w, w->X, w->Y, w->Width, w->Height, draw_screen);
+	DrawWindow(w, 0, 0, w->Width, w->Height, draw_screen);
 }
 
 void MoveWindow(guiserver_window* w, int x, int y)
@@ -400,13 +402,14 @@
 			break;
 		// ウィンドウ描画要求
 		case MSG_GUISERVER_DRAWWINDOW:
-			if (msg->arg2 != 0 && msg->arg3 != 0) {
+			if (msg->arg2 == 0 && msg->arg3 == 0) {
+				// 全体描画
+				DrawWindow(GetWindowPointer(msg->arg1), true);
+			} else {
 				// 部分描画
 				DrawWindow(GetWindowPointer(msg->arg1),
 					GET_X_DWORD(msg->arg2), GET_Y_DWORD(msg->arg2),
 					GET_X_DWORD(msg->arg3), GET_Y_DWORD(msg->arg3), true);
-			} else {
-				DrawWindow(GetWindowPointer(msg->arg1), true);
 			}
 			Message::reply(msg);
 			break;

コメント

最新の1000件を表示しています。 コメントページを参照

お名前:
  • 方針とその流れは終えていると思うのですが、実装に関してはこの件は私の手を離れたと思っても良いですか?。>Tinoさん、baysideさん -- ひげぽん 2006-09-18 (月) 21:45:54
    • ひげぽんさんのスケジュール次第ではないでしょうか。やりたいということであれば誰も止めないと思います。 -- Tino 2006-09-18 (月) 23:46:57
      • 可能であればbaysideさんにお任せしたいと考えています。方針・背景は理解した上で適任者にお任せしたいという意図です。 -- ひげぽん 2006-09-18 (月) 23:49:01
      • ということでよろしいでしょうか>baysideさん -- ひげぽん 2006-09-19 (火) 23:12:26
      • 了解です。 -- bayside
  • とりあえずこれで今回の私の役割は終わったのではないかと思いますので、しばらくウォッチに移ります。色々とお騒がせしました。OSCの参加方法とかあれば教えてください。それでは。 -- Tino 2006-09-18 (月) 19:02:07
    • 打ち上げ会に参加する場合は、http://www.ospn.jp/osc2006-fall/ に登録いただく必要がありますが、それ以外は無料ですので、当日直接会場にきていただければ大丈夫です。会場でゆっくり話す機会もないでしょうから、打ち上げ会の2次会(もしくは閉会から打ち上げまでの時間)とかいかがでしょう? -- bayside 2006-09-18 (月) 19:38:46
    • 以前はOSC全体の会合ではなくMona単独の会合だったと聞いていますが、今回は単独開催はしないということでしょうか? -- Tino 2006-09-18 (月) 23:45:18
  • Component::update(x, y, w, h)がAWTにないという問題を追記しておきました。 -- Tino 2006-09-18 (月) 18:51:17
  • GUIサーバーのパッチができました。上に貼っておきます。BayGUIの方でもこれに合わせて修正していただく必要があります。 -- Tino 2006-09-18 (月) 18:44:26
  • Graphics::setClip() および Graphics::translate() は用意していますので、これを描画に影響を与えるように改良して使って欲しいです。AWTにないAPIを増やすのは良策ではありません。 -- bayside 2006-09-18 (月) 17:19:53
    • baysideさんが作業していただくのが一番良いと思うのですが、時間的に厳しいでしょうか?サーバー周りは私がやっても良いのですけど。 -- Tino 2006-09-18 (月) 17:21:07
    • 今週はデスマーチ気味なので、来週であれば可能です。 -- bayside 2006-09-18 (月) 17:22:58
    • 了解しました。私は急いでおりませんので、来週でも結構ですからお願いしたいと思います。私の方でGUIサーバーのパッチを作ることにします。 -- Tino 2006-09-18 (月) 17:27:08
  • ひげぽんさんから「こういう話は飲みながら話した方が良いのかも知れませんね。」というご提案がありましたが、OSCに参加すると実現できると考えてもよろしいのでしょうか? -- Tino 2006-09-18 (月) 17:16:24
    • 私も考えていましたが、ぜひ Tino さんにも OSC にきていただいて、今後の Mona の方向性について話し合いたいです。 -- bayside 2006-09-18 (月) 17:20:48
    • 今だからばらしますが、実は昔、ひげぽんさんにbaysideさんも交えて一度話し合いたいということで仲介をお願いしたのですが、たまたまMona本執筆中&転職活動中の一番お忙しい時期だったため、断られてしまったという経緯があります。というわけで前向きに検討させていただきたいと思います。 -- Tino 2006-09-18 (月) 17:22:37
      • もしやるならば必須参加者は他には Gakuさん、shadowさんあたりかな?。可能ならばYumeさんやEDS1275さんYasさんnikqさんokuokuさんにも参加してほしいです。-- ひげぽん
      • これはOSCとは別個の会合ということでよろしいでしょうか?私が当時baysideさんとの仲介を依頼したのは、ダイレクトに交渉するとそれこそひげぽんさんのイメージでの「燃え上がる」かもしれないと危惧していたので、仲介役としてお願いしたかったということです。 -- Tino 2006-09-18 (月) 23:48:54
  • 高速化はバグ修正ではないので、OSCに間に合わなくても大丈夫です。でも、入れるのでしたらそろそろ判断したほうがいいです。 -- bayside 2006-09-18 (月) 00:54:48
  • 話が少し逸れますが、「1.OSCまでに高速化するのか?」「2.対応を進めるという判断がくだされたらどういう分担か」あたりもそろそろ考えないとダメですね -- ひげぽん 2006-09-18 (月) 00:49:16
  • GUIサーバ高速化/06.AWT調査後の方針/具体的に」からコメントを移動させていただきました。 -- Tino 2006-09-18 (月) 16:06:18

MENU

now: 9

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3111, today: 1, yesterday: 0

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:47:54 (3912d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.072 sec.