调整大小时 C XLib 中黑色闪烁

问题描述 投票:0回答:1

我编写了一个以 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时手动重新绘制窗口将完全消除所有情况下的问题。然而,它似乎更像是一个拐杖,而不是问题的直接解决方案。

c graphics resize xlib
1个回答
0
投票

双缓冲或后备存储应该会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.