我对 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 服务器的另一个深奥原因可能是另一个客户端有一个服务器抓取,这使服务器无法处理来自其他任何人的请求。
关键策略通常是:
这些通常是主要问题,异常(exception)是当您执行一些真正繁重的操作(例如移动大量图像数据)时,单个操作可能比操作数或往返阻塞更重要。
关于xserver - XCreateGC 函数性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7607728/