如何使用xlib创建游戏循环

时间:2015-09-20 14:11:45

标签: c++ linux x11 xlib

我正在尝试为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绘制比使用所有像素循环更快的方法吗?双缓冲不应该解决这个问题,还是我不正确地实现它?

1 个答案:

答案 0 :(得分:3)

直接与Xlib进行沟通是在90年代早期(阅读:没有人这样做,除非他是过去20年的框架设计师!)。

你是对的,循环显示像素以在屏幕上更新它们难以置信慢。这就是为什么几乎所有现代GUI框架都使用他们自己的Xbuffers,他们只是绘制并指示X渲染。

作为对您的方法的评论: 原始X上的游戏开发并没有什么意义,因为有更多可用,性能更好,更易于使用,小巧,经过良好测试的库。以SDL为例。