X11 应用程序无法使用双缓冲绘制
X11 application cant draw w/ double buffering
我在 Linux 上有一个用 C 运行 编写的小应用程序,它创建了一个简单的 X window,带有双缓冲区,写入一些像素然后刷新。
我注意到,如果我不添加延迟,则刷新的图片不会出现,我在这里做错了什么?
小应用基本上是:
Display * dsp = XOpenDisplay(NULL);
Window win = XCreateSimpleWindow(dsp, DefaultRootWindow(dsp), 0, 0, SIZ + 1, SIZ + 1, 1, 0, 0xffffff);
XMapWindow(dsp, win);
GC gc = XCreateGC(dsp, win, 0, NULL);
Pixmap double_buffer = XCreatePixmap(dsp, win, SIZ + 1, SIZ + 1, 24);
// write some pixels:
XSetForeground(dsp, gc, 0);
snprintf(buf, 2, "%c", ord);
text.chars = buf;
text.nchars = 1;
text.delta = text.font = 0;
XDrawText(dsp, double_buffer, gc, i, j, &text, 1);
// switch buffers:
XCopyArea(dsp, double_buffer, win, gc, 0, 0, SIZ, SIZ, 0, 0);
sleep(1); /* if I don't add this nothing is shown */
XFlush(dsp);
我的机器是 64 位 Linux Debian,带有 openbox 和合成器 (compton)。对于 X11,我使用的是 libx11-xcb-dev 和 intel 驱动程序,没有专用 GPU。
X11 不能以这种简单的方式工作。它是事件驱动的。您至少应该等待 Expose
事件,以便 window 在其上进行一些绘制。例如,参见此 Equivalent of "Invalidate Rect" / "WM_PAINT" in X11。
我在 Linux 上有一个用 C 运行 编写的小应用程序,它创建了一个简单的 X window,带有双缓冲区,写入一些像素然后刷新。
我注意到,如果我不添加延迟,则刷新的图片不会出现,我在这里做错了什么?
小应用基本上是:
Display * dsp = XOpenDisplay(NULL);
Window win = XCreateSimpleWindow(dsp, DefaultRootWindow(dsp), 0, 0, SIZ + 1, SIZ + 1, 1, 0, 0xffffff);
XMapWindow(dsp, win);
GC gc = XCreateGC(dsp, win, 0, NULL);
Pixmap double_buffer = XCreatePixmap(dsp, win, SIZ + 1, SIZ + 1, 24);
// write some pixels:
XSetForeground(dsp, gc, 0);
snprintf(buf, 2, "%c", ord);
text.chars = buf;
text.nchars = 1;
text.delta = text.font = 0;
XDrawText(dsp, double_buffer, gc, i, j, &text, 1);
// switch buffers:
XCopyArea(dsp, double_buffer, win, gc, 0, 0, SIZ, SIZ, 0, 0);
sleep(1); /* if I don't add this nothing is shown */
XFlush(dsp);
我的机器是 64 位 Linux Debian,带有 openbox 和合成器 (compton)。对于 X11,我使用的是 libx11-xcb-dev 和 intel 驱动程序,没有专用 GPU。
X11 不能以这种简单的方式工作。它是事件驱动的。您至少应该等待 Expose
事件,以便 window 在其上进行一些绘制。例如,参见此 Equivalent of "Invalidate Rect" / "WM_PAINT" in X11。