一尘不染

如何使用xlib创建游戏循环

linux

我正在尝试为xlib窗口创建游戏循环,但是无法正确绘制该窗口。现在,我正在使用XCreateSimpleWindow(…)创建一个窗口,并使用for循环一次绘制所有像素。(这些像素的颜色是从一个大的整数数组中读取的,现在,我将所有像素设置为蓝色。)现在,实际的游戏循环如下:

void loop() {
    while (true) {
        // Clear the window (the background color is set to white)
        XClearWindow(dsp, win);

        // Loop through all pixels of the 800*600 window
        for (int j = 0; j < 600; j++) {
            for (int i = 0; i < 800; i++) {
                // Read the color from the pixels array (always blue for now)
                long int color = pixels[i + 800*j];
                // Set the foreground color for drawing
                XSetForeground(dsp, gc, color);
                // Draw the pixel
                XDrawPoint(dsp, win, gc, i, j);
            }
        }

        // Flush the output buffer
        XFlush();
    }
}

全局定义了变量dsp,win,pixels,gc。

现在,当我编译并执行二进制文件时,y坐标低的行主要是蓝色,而y坐标高的行大部分是白色。在这两者之间,很容易看到一次绘制所有像素仅花费太多时间。我希望这种效果是因为首先绘制了顶行(低y),这意味着这些像素的XClearWindow()和XDrawPoint()之间有短暂的延迟。(我还测试了fps,一次运行while(true)循环大约需要7毫秒。)

我做了一些研究,并了解了双缓冲如何解决此问题。我确实遵循了有关使用xlib(Xdbe)进行双重缓冲的指南,但是它似乎无法解决问题。使用xlib绘制是否比仅遍历所有像素更快的方法?是不是应该使用双缓冲来解决这个问题,还是我实施不正确?


阅读 277

收藏
2020-06-07

共1个答案

一尘不染

与Xlib进行直接通信是如此的早在90年代(请阅读:在过去20年中,除非他是框架设计师,否则没有人做过!)。

没错,在像素间循环以更新屏幕上的像素 非常
慢。这就是为什么几乎所有现代GUI框架都使用它们自己的Xbuffer(它们只是在上面绘制并指示X进行渲染)的原因。

作为对您的方法的评论:在原始X上进行游戏开发没有什么意义,因为它具有更稳定,性能更好,更易于使用的小型,经过良好测试的库。以SDL为例。

2020-06-07