私は Xlib だけでなく、Linux インターフェイス プログラミングも初めてです。
あるウィンドウのコンテンツを別のウィンドウに描画するという一般的なタスク(信頼できる例が見つからないため、それほど一般的ではない)を解決しようとしています。
しかし、私は深刻なパフォーマンスの問題に直面しており、プログラムをより高速で信頼性の高いものにするために使用できるソリューションを探しています。
ここで、プログラム フローに関する情報をいくつか提供します。選択したプログラムの設計が正しいかどうかわからないためです。Xlib の使用方法に誤りがある可能性があります。
プログラムは、アクティブなウィンドウ (今後はSrcWinと呼ばれます) の ID (Xlib "ウィンドウ" タイプ) を適切な方法で取得します (一部のプログラムのウィジェットの ID ではなく、すべてのコンテンツが描画される実際の可視ウィンドウ) XGetInputFocus
。フォーカスされたウィンドウを取得XQueryTree
し、ルート ウィンドウの子が見つかったときに使用してウィンドウを反復し、XmuClientWindow
関数を使用して名前付きウィンドウを取得します (まだ見つかっていない場合)。
次に、それを使用して、同じサイズの新しいウィンドウ(TrgWinと呼ばれる)を作成する関数で使用されるSrcWinXGetWindowAttributes
の幅と高さを取得します。XCreateSimpleWindow
新しいウィンドウ TrgWin には、KeyPressやExpose usingXSelectInput
関数などのいくつかのイベントが登録されます。
グラフィックス コンテキストは次のように作成されます。
GC gc = DefaultGC (Display, ScreenCount (Display) - 1);
ここで、無限ループが開始されます。このループselect
関数は、X 接続上の何らかのイベントまたはタイムアウト ( struct timeval
) を待機するために呼び出されます。
その後、プログラムは次を使用してSrcWinから画像を取得しようとします。
XImage *xi;
xi = XGetImage (Display, SrcWin, 0, 0, SrcWinWidth, SrcWinHeight, AllPlanes, ZPixmap);
画像が正常に取得された場合、それはTrgWinに配置されます。
if (xi)
{
XPutImage (Display, TrgWin, gc, xi, 0, 0, 0, 0, SrcWinWidth, SrcWinHeight);
XFree (xi);
}
保留中のイベントは、次の場合に処理されます。
while (XPending (Display))
{
XNextEvent (Display, &XEvent);
/* some event processing using switch(XEvent.type){} */
}
上記のように、プログラムはほぼ期待どおりに動作します。しかし、このプログラムで 40 ミリ秒ごとにSrcWinのコンテンツをTrgWinに描画させようとすると(これは timeval 値であり、イベントではより高速になる可能性があります)、コア i5-3337U ではこれに 21% の CPU 時間がかかります。プログラムと、Xorg プロセスが 683*752 のウィンドウを同じサイズの別のウィンドウに描画するのに 20% 近くかかります。
私の観点からは、SrcWin のピクセルを含むメモリ領域を TrgWin の対応するメモリ領域にマッピングできればよかったのですが、Xlib プログラミングが苦手で、それが可能であるかどうかは疑問です。標準 Xlib 関数。
1)しかし、私はKDE環境を開始してウィンドウスイッチャーをチェックしました。すべてのウィンドウのサムネイルは、深刻なCPU負荷なしでリアルタイムでウィンドウスイッチャーのウィンドウに描画されます。それはどのように行われますか?
2) どこかで XShmGetImage + XShmPutImage メカニズムが言及されています - 私のプログラムにとって XGetImage+XPutImage よりも優れていますか?
3) また、QT と GTK に「window-damage」イベントのようなものがあることを見ました。それはツールキット固有のイベントですか、それとも Xlib に相当するものですか?
4) QT と GTK の「window-damage」イベントは、ウィンドウの画像バッファーが変更された後に信号が送信されるため、ウィンドウ内の少なくとも 1 つのピクセルが変更されるすべてのイベントがそのようなイベントを生成していることを理解しましたか? SrcWin に変更がなくても、40 ミリ秒ごとに TrgWin コンテンツを継続的に変更することを取り除くことができるので、Xlib にこのようなものがあれば素晴らしいでしょう。
5) 簡単にするために GTK+ を使用する必要がありますか?
返信ありがとうございます。大量のテキストで申し訳ありません。