我编写了一个以 60fps 渲染到 XLib 窗口的程序。 当我调整窗口大小时,XLib 似乎将窗口清除为黑色,并且在我的 60fps 渲染周期重新绘制窗口之前效果会持续存在,导致窗口调整大小时出现烦人的闪烁。
我似乎能做的最好的事情就是在每次调整屏幕大小时重新绘制屏幕,这会消除大部分闪烁,但不是全部。难道我不能做一些事情来完全消除闪烁吗?理想情况下,我希望通过某种方式告诉 Xlib 在调整大小时不要将窗口清除为黑色。
这是我用来处理窗口大小调整的ConfigureNotify 事件处理程序的代码:
case ConfigureNotify:
if (ev.xconfigure.width != ximg.width
|| ev.xconfigure.height != ximg.height) {
ximg.width = ev.xconfigure.width;
ximg.height = ev.xconfigure.height;
RenderResize(ximg.width, ximg.height);
ximg.bytes_per_line = RenderGetBytesPerRow();
ximg.data = RenderGetMemory();
PlatformPasteBuffer(displayPt, window, gc, &ximg);
}
RenderResize 是调整内部内存缓冲区大小的函数,随后将其分配给 XImage 数据。 PlatformPasteBuffer 将 XImage 复制到窗口。
这是我实例化窗口的方法:
displayPt = XOpenDisplay(NULL);
s32 screenId = DefaultScreen(displayPt);
ximg = *XCreateImage(displayPt, DefaultVisual(displayPt, screenId),
DefaultDepth(displayPt, screenId), ZPixmap, 0, RenderGetMemory(),
pxWidth, pxHeight, bpp * 8, RenderGetBytesPerRow());
u64 rootWindow = XRootWindow(displayPt, screenId);
window = XCreateSimpleWindow(displayPt, rootWindow,
0, 0, ximg.width, ximg.height, 0, 0, 0);
gc = XCreateGC(displayPt, window, 0, 0);
我预计在处理ConfigureNotify时手动重新绘制窗口将完全消除所有情况下的问题。然而,它似乎更像是一个拐杖,而不是问题的直接解决方案。
双缓冲或后备存储应该会有所帮助。