我正在尝试为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绘制是否比仅遍历所有像素更快的方法?是不是应该使用双缓冲来解决这个问题,还是我实施不正确?
与Xlib进行直接通信是如此的早在90年代(请阅读:在过去20年中,除非他是框架设计师,否则没有人做过!)。
没错,在像素间循环以更新屏幕上的像素 非常 慢。这就是为什么几乎所有现代GUI框架都使用它们自己的Xbuffer(它们只是在上面绘制并指示X进行渲染)的原因。
作为对您的方法的评论:在原始X上进行游戏开发没有什么意义,因为它具有更稳定,性能更好,更易于使用的小型,经过良好测试的库。以SDL为例。