GUIサーバ高速化/02.進めかた


Top / GUIサーバ高速化 / 02.進めかた

GUI高速化

大まかな流れ

部分描画実装のための調査

Tinoさんへの質問

1. libguiの動き

GUIサーバーの共有オブジェクト

GUIサーバーは以下の2種類のオブジェクトを共有メモリに作成してクライアントと共有します。

  1. guiserver_bitmap
  2. guiserver_window

以前junjunn氏からもご指摘がありましたが、このアーキテクチャは非常に脆弱で、 クライアントからの不正なアクセスで簡単にサーバーを落とすことができます。 オブジェクトそのものを共有せずに、 プロパティはメッセージを通して読み書きするように変更する必要があるでしょう。

もっともそれは今回の高速化には関係ないので突っ込みません。

guiserver_window

生のまま扱うのは面倒なので、 libguiではSystem::Mona::Forms::Controlでラッピングしています。

Create()でMSG_GUISERVER_CREATEWINDOWを発行して、 GUIサーバーにguiserver_windowを作ってもらいます。

guiserver_bitmap

生のまま扱うのは面倒なので、 libguiではSystem::Drawing::Bitmapでラッピングしています。

コンストラクタでMSG_GUISERVER_CREATEBITMAPを発行して、 GUIサーバーにguiserver_bitmapを作ってもらいます。

バッファ

guiserver_window構造体はバッファへのハンドルを保持します。

GUIサーバーに作ってもらったguiserver_windowのバッファは空です。 そのためバッファの作成はクライアント側で行って、 ハンドルを入れることで関連付けるようになっています。

そのバッファはguiserver_bitmapそのものです。 libguiではSystem::Drawing::Bitmapを使うことになります。

描画処理

概要

描画は以下の流れになります。 書き込みをどこでやっているかを示しています。

  1. ウィンドウバッファ (System::Mona::Forms::Control::buffer)
     ↓libgui: System::Mona::Forms::Control::Refresh()
  2. トップレベルウィンドウバッファ (System::Mona::Forms::Control::formBuffer)
     ↓MSG_GUISERVER_DRAWWINDOW
     ↓サーバー: DrawWindow()
  3. 裏VRAM (screen_buffer)
     ↓サーバー: DrawScreen()
  4. 実VRAMキャッシュ (vram_buffer)
     ↓サーバー: DrawScreen()
  5. 実VRAM

コピーを少なくする方法

  1. 描画の際にクリッピングを行えばウィンドウバッファは不要。
    • ウィンドウバッファはクライアント内で完結しているので、サーバーの修正は不要。
  2. 透過処理や非矩形描画を行わなければトップレベルウィンドウバッファと裏VRAMは不要。
  3. 効果がなければ実VRAMキャッシュは不要。
    • キャッシュはDrawScreen()だけで使われているので、外してnoiz2bgなどでベンチマークするのは簡単。

高速化のヒント

コメント

コメントはありません。 コメント/GUIサーバ高速化/02.進めかた?

お名前:

MENU

now: 5

リンク


最新の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: 3274, today: 6, yesterday: 0

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

Last-modified: 2008-03-28 (金) 15:47:54 (3859d);  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.050 sec.