小编Ant*_*ich的帖子

(XGetImage + XPutImage) VS XCopyArea VS (XShmGetImage + XShmPutImage) VS GTK+ 的性能

UPD:很久以前就应该更新这篇文章,但如果有人需要示例,可以在https://github.com/awpe/xwinclone上看到结果软件。


我不仅对 Xlib 很陌生,而且对 Linux 接口编程也很陌生。

我正在尝试解决将一个窗口的内容绘制到另一个窗口的常见任务(这并不像看起来那么常见,因为我找不到任何可靠的示例)。

然而,我遇到了严重的性能问题,我正在寻找可以用来使程序更快、更可靠的解决方案。

现在我将提供一些有关程序流程的信息,因为我不确定所选的程序设计是否正确,也许我使用Xlib的方式存在一些错误。

程序以适当的方式获取活动窗口(从现在起称为SrcWin)的ID(Xlib“Window”类型)(不是某些程序的小部件的ID,而是绘制所有内容的真实可见窗口),首先它XGetInputFocus用于获取焦点窗口,然后在找到根窗口的子窗口时使用迭代窗口XQueryTree,然后使用XmuClientWindow函数获取命名窗口(如果不是已找到的窗口)。

然后使用它获取SrcWinXGetWindowAttributes的宽度和高度,它们都在函数中用于创建相同大小的新窗口(称为TrgWin )。XCreateSimpleWindow

一些事件是为新窗口 TrgWin 注册的,例如KeyPressExpose usingXSelectInput函数。

图形上下文是这样创建的:

GC  gc = DefaultGC (Display, ScreenCount (Display) - 1);
Run Code Online (Sandbox Code Playgroud)

现在开始无限循环,在此循环中select调用函数来等待 X 连接上的某些事件或超时 ( struct timeval)。

之后该程序尝试使用以下命令从SrcWin获取图像:

XImage *xi;
xi = XGetImage (Display, SrcWin, 0, 0, SrcWinWidth, SrcWinHeight, AllPlanes, ZPixmap);
Run Code Online (Sandbox Code Playgroud)

如果成功获取图像,则会将其放入TrgWin

if (xi)
{
    XPutImage (Display, TrgWin, gc, …
Run Code Online (Sandbox Code Playgroud)

c c++ gtk xlib xcb

6
推荐指数
0
解决办法
2306
查看次数

标签 统计

c ×1

c++ ×1

gtk ×1

xcb ×1

xlib ×1