XGetImage 需要很多时间 运行
XGetImage takes a lot of time to run
XGetImage 需要 3-4 秒才能执行并完全冻结 X11
Display *display;
display = XOpenDisplay(NULL);
if (!display) {fprintf(stderr, "unable to connect to display");return 7;}
Window w;
int x,y,i;
unsigned m;
Window root = XDefaultRootWindow(display);
if (!root) {fprintf(stderr, "unable to open rootwindow");return 8;}
//sleep(1);
if(!XQueryPointer(display,root,&root,&w,&x,&y,&i,&i,&m))
{ printf("unable to query pointer\n"); return 9;}
XImage *image;
XWindowAttributes attr;
XGetWindowAttributes(display, root, &attr);
image = XGetImage(display,root,0,0,attr.width,attr.height,AllPlanes,XYPixmap);
XCloseDisplay(display);
if (!image) {printf("unable to get image\n"); return 10;}
在 Xorg 日志中:
[ 13234.693] AUDIT: Thu Jan 7 20:12:13 2016: 3856: client 45 connected from local host ( uid=500 gid=500 pid=12993 )
Auth name: MIT-MAGIC-COOKIE-1 ID: 153
[ 13238.774] AUDIT: Thu Jan 7 20:12:18 2016: 3856: client 45 disconnected
time:
real 0m4.080s
user 0m0.002s
sys 0m0.007s
理想情况下,我希望此功能在不到 0.1 秒的时间内 运行
XYPixmap
是一种非常特殊的格式,用途不多。您应该几乎总是使用 ZPixmap
。
XYPixmap
工作一个平面一个平面。这是什么意思?取每个像素的位 0,并将所有这些位紧密地打包在一个 unsigned int
的数组中。那是你的平面 0。然后取每个像素的位 1,并将所有这些位打包到一个数组中。那是你的平面 1。然后取每个像素的位 2...
Framebuffer
__________________________________________________________________
/
Pixel 0 Pixel 1 Pixel 2
[0][1][2][3][4][5][6][7] [0][1][2][3][4][5][6][7] [0][1][2]....
| | |
| +------------------------+ |
| | |
| | +--------------------------------------------------+
| | |
v v v
[0][0][0]..... \
(Plane 0) |
|
[1][1][1].... | Result
(Plane 1) |
.... |
[7][7][7].... |
(Plane 7) |
/
如果你的帧缓冲区是这样存储的,这是大多数现代硬件的情况,那就是很多位操作!
图片显示8位像素,但对于任何其他深度都是一样的。
另一方面,ZPixmap
获取整个像素并将它们填充到一个数组中:
Framebuffer
__________________________________________________________________
/
Pixel 0 Pixel 1 Pixel 2
[0][1][2][3][4][5][6][7] [0][1][2][3][4][5][6][7] [0][1][2]....
| | | | | | | | | | | | | | | | | | |
v v v v v v v v v v v v v v v v v v v
[0][1][2][3][4][5][6][7] [0][1][2][3][4][5][6][7] [0][1][2]....
\_____________________________________________________________________
Result
这是简单的直接复制,应该很快。
XGetImage 需要 3-4 秒才能执行并完全冻结 X11
Display *display;
display = XOpenDisplay(NULL);
if (!display) {fprintf(stderr, "unable to connect to display");return 7;}
Window w;
int x,y,i;
unsigned m;
Window root = XDefaultRootWindow(display);
if (!root) {fprintf(stderr, "unable to open rootwindow");return 8;}
//sleep(1);
if(!XQueryPointer(display,root,&root,&w,&x,&y,&i,&i,&m))
{ printf("unable to query pointer\n"); return 9;}
XImage *image;
XWindowAttributes attr;
XGetWindowAttributes(display, root, &attr);
image = XGetImage(display,root,0,0,attr.width,attr.height,AllPlanes,XYPixmap);
XCloseDisplay(display);
if (!image) {printf("unable to get image\n"); return 10;}
在 Xorg 日志中:
[ 13234.693] AUDIT: Thu Jan 7 20:12:13 2016: 3856: client 45 connected from local host ( uid=500 gid=500 pid=12993 )
Auth name: MIT-MAGIC-COOKIE-1 ID: 153
[ 13238.774] AUDIT: Thu Jan 7 20:12:18 2016: 3856: client 45 disconnected
time:
real 0m4.080s
user 0m0.002s
sys 0m0.007s
理想情况下,我希望此功能在不到 0.1 秒的时间内 运行
XYPixmap
是一种非常特殊的格式,用途不多。您应该几乎总是使用 ZPixmap
。
XYPixmap
工作一个平面一个平面。这是什么意思?取每个像素的位 0,并将所有这些位紧密地打包在一个 unsigned int
的数组中。那是你的平面 0。然后取每个像素的位 1,并将所有这些位打包到一个数组中。那是你的平面 1。然后取每个像素的位 2...
Framebuffer
__________________________________________________________________
/
Pixel 0 Pixel 1 Pixel 2
[0][1][2][3][4][5][6][7] [0][1][2][3][4][5][6][7] [0][1][2]....
| | |
| +------------------------+ |
| | |
| | +--------------------------------------------------+
| | |
v v v
[0][0][0]..... \
(Plane 0) |
|
[1][1][1].... | Result
(Plane 1) |
.... |
[7][7][7].... |
(Plane 7) |
/
如果你的帧缓冲区是这样存储的,这是大多数现代硬件的情况,那就是很多位操作!
图片显示8位像素,但对于任何其他深度都是一样的。
另一方面,ZPixmap
获取整个像素并将它们填充到一个数组中:
Framebuffer
__________________________________________________________________
/
Pixel 0 Pixel 1 Pixel 2
[0][1][2][3][4][5][6][7] [0][1][2][3][4][5][6][7] [0][1][2]....
| | | | | | | | | | | | | | | | | | |
v v v v v v v v v v v v v v v v v v v
[0][1][2][3][4][5][6][7] [0][1][2][3][4][5][6][7] [0][1][2]....
\_____________________________________________________________________
Result
这是简单的直接复制,应该很快。