特定のアプリケーションを長時間表示していると描画が乱れる (WindowsのGDIオブジェクトを大量に消費する)
ASTEC-Xで特定のXクライアント(UNIXアプリケーション)を表示して操作をしていると、 最初は問題ないのに、ある時点から以降に描画が乱れるという場合には、 WindowsのGDIリソースが大量に消費されて枯渇している可能性があります。 このような場合には、ASTEC-X の GDIリソースの枯渇を防ぐオプションをお試しください。
WindowsのGDIリソースの枯渇が原因で描画が乱れる場合は、 ASTEC-Xのウィンドウの中だけでなく、Windowsの画面全体が描画が乱れるのが特徴です。 例えば、ウィンドウをドラッグするとドラッグした軌跡がWindowsの壁紙上に残るなどの現象が発生します。
GDIリソースの消費量を確認する
GDIリソースの消費量は、Windowsのタスクマネージャで確認できます。
- タスクマネージャを起動して、[プロセス] のタブを選択してください。
- タスクマネージャのメニューから "表示" → "列の選択" を選んで "列の選択" パネルを表示し、"GDIオブジェクト" にチェックをします。 すると、パネルに "GDIオブジェクト" という項目が追加されます。
- これまで通りの方法で ATEC-X 上で問題のUNIXアプリケーションを起動して、 問題が発生するまで操作してください。
- パネルに表示された、イメージ名 "astecx.exe" の行を確認します。
"GDIオブジェクト" の値を見ると、GDIリソースを491個使用していることがわかります。 この程度であれば、まったく問題ありません。
しかし、"GDIオブジェクト" の値が約9000近くになると、 Windows の描画が乱れるようになります。 また、"GDIオブジェクト" の値が数千以上になっている場合には、 Xクライアント (UNIXアプリケーション) でリソースリークが発生している可能性があります。
GDIリージョンの使用数を制限する
ASTEC-Xのプロセスが、GDIリソースを大量に (数千以上) 消費している場合には、 ASTEC-X のコントロールパネルの "サーバー" → "パフォーマンス" のパネルの "GDIリージョンの使用数を制限する" にチェックをして、ASTEC-X を起動してください。
「GDIリージョンの使用数を制限する」オプションの概要
GDIリソースが枯渇する原因
WindowsのGDIリソースが大量に消費される原因は、 Xクライアント (UNIXアプリケーション) が Xサーバー (ASTEC-X) に対して、 グラフィックスコンテキスト (GC) と呼ばれる、 Xサーバーが保持するある種の資源(リソース)を大量に確保するよう要求したまま、 これらを開放しないことにあります。
Xサーバーは、Xクライアント (UNIX アプリケーション) 側から GC を確保するよう要求をうけて GC を確保した後は、 それを破棄する要求が Xクライアントからあるまで、GC を保持し続けます。 これは X Window System のルールです。
ASTEC-X のデフォルト設定 ("GDIリージョンの使用数を制限する" にチェックをしない状態) では、Xクライアント (UNIX アプリケーション) 側から 1個のGCの確保の要求があると、 対応する 1個の Windows のリソース (リージョンリソース) を確保するように動作します。 したがって、UNIX アプリケーション側から GC を破棄するリクエストが無ければ、 ずっと、Windows のリソースも確保し続けることになります。
Windows のリージョンリソースは、ペンやブラシなどと同様、 Windows の GDI リソースの1つで、Windows 全体で同時に使用できる数に制限があります。 弊社環境で確認したところでは、Windows2000 の場合で、 リージョンリソースを約 9900 個弱までしか確保することができませんでした。
"GDIリージョンの使用数を制限する" を有効にした場合の動作
GC 毎に Windows のリージョンリソースを割り当てるのではなく、実際に 描画が行われる直前に毎回必要な Windows のリージョンリソースを ASTEC-X 全体で1つだけ確保して、これを使いまわすようにします。
なお、"GDIリージョンの使用数を制限する" を有効にすると、 あらかじめ大量に GC を確保してこれを何度も交互に入れ替えて使用するようなタイプの X アプリケーションでは、 パフォーマンスが若干低下する可能性があります。