xserver - XCreateGC 函数性能

标签 xserver x11

我对 XCreateGC 函数性能有疑问。似乎在某些情况下工作正常(快速),而在其他情况下则非常慢:)。有关更多详细信息,请查看此代码:

void some_function(int dx, int dy, int sx, int sy, int w, int h,
                Drawable src, Drawable mask, Drawable dest)
{
        Display *dpy = QX11Info::display();
        GC gc = XCreateGC(dpy, src, 0, 0);
        XSetClipOrigin(dpy, gc, dx - sx, dy - sy);
        XSetClipMask(dpy, gc, mask);
        XCopyArea(dpy, src, dest, gc, sx, sy, w, h, dx, dy);
        XFreeGC(dpy, gc);
}

提前致谢。

最佳答案

Xlib 性能的关键是了解库何时需要阻止来自 X 服务器的回复。一般来说,创建资源(如GC)不需要阻塞;资源ID在客户端分配,创建请求只是排队或发送,无需等待回复。当一个 Xlib 调用最终需要回复时,它必须突然停止并等待所有请求完成,获得所有待处理的回复,最后获得手头调用的回复。这将使一个 Xlib 函数看起来 super 慢,但实际上您可能会看到一大堆先前函数的成本。

不过,据我所知,XCreateGC 不应该阻止回复。由于发送缓冲区已满,它可能会阻塞?也许你有大量的请求,在某个时候你的应用程序在一个完整的套接字缓冲区阻塞时停止,直到 X 服务器可以 catch 并读取更多请求。

无论如何,由于这个问题已经过时,询问细节可能为时已晚,但我认为基本答案是,如果您使用分析器,当 Xlib 实际等待或经历后果时,Xlib 函数调用可能在堆栈上一些较早的 Xlib 函数调用,或者只是您正在发出的 X 请求的绝对数量。很可能 XCreateGC 本身不是问题。

等待 X 服务器的另一个深奥原因可能是另一个客户端有一个服务器抓取,这使服务器无法处理来自其他任何人的请求。

关键策略通常是:

  • 减少 X 请求的数量
  • 在阻止回复之前尽可能多地做(粗略的经验法则,任何称为 XGetSomething 的东西都必须等待所有待处理的请求完成,然后收集所有回复)

  • 这些通常是主要问题,异常(exception)是当您执行一些真正繁重的操作(例如移动大量图像数据)时,单个操作可能比操作数或往返阻塞更重要。

    关于xserver - XCreateGC 函数性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7607728/

    相关文章:

    java - HttpURLConnection - 响应代码 : 400 (Bad Request) Android Studio -> xserve

    rust - xcb:在 EnterNotify 之后立即收到 LeaveNotify

    linux - 调试用户输入时启用断点 (gdb/linux)

    c - C 中的 Xview 内存缓冲区

    perl - Perl 中的 SSH 与 X11 转发

    java - 如何在没有桌面环境的情况下从 Linux shell 运行 Java Swing 应用程序?

    docker - Docker 容器内部 : "Error: cannot open display: localhost:11.0"

    Ubuntu 12.10 Crontab 启动 Vino VNC Server

    linux - 附加/分离到 Eclipse 的远程实例

    c++ - GLSL 4.3 纹理问题