我正在尝试创build一个xlib窗口的游戏循环,但是我无法正确地绘制窗口。 现在我正在用XCreateSimpleWindow(…)创build一个窗口,并使用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(); } }
variablesdsp,win,pixels,gc是全局定义的。
现在当我编译和执行二进制文件时,y坐标较低的行大多是蓝色的,而y坐标较高的行大多是白色的。 在这两者之间很容易看出,一次绘制所有像素需要花费太多时间。 我期望这种效果是因为顶部行(低y)被首先绘制,这意味着这些像素在XClearWindow()和XDrawPoint()之间有一个短暂的延迟。 (我也testing了fps,一次运行while(true)循环需要大约7毫秒。)
我做了一些研究,并了解了双缓冲如何解决这个问题。 我确实按照xlib(Xdbe)的双缓冲指南,但似乎没有解决问题。 有没有更快的方式绘制xlib而不只是循环所有的像素? 双缓冲不应该解决这个问题,还是我实施不正确?
直接与Xlib沟通是如此之早 – 90年代(阅读:没有人做过这个,除非他是框架设计师,在过去的20年!)。
你是对的,通过像素循环来更新它们在屏幕上是非常慢的。 这就是为什么几乎所有的现代GUI框架都使用他们自己的XBuffer,他们只是在绘制并指示X渲染。
作为对您的方法的评论:原始X上的游戏开发没有多少意义,因为有更多的可移植,更好的执行,更容易使用,小,经过充分测试的库。 以SDL为例。
你没有看到什么是因为你忽略了X事件循环。 你所做的只是把数据发送到X服务器,但是X服务器没有办法进行通信。
您必须设置一个循环,从队列中读取XEvent并分派处理的cq。 就像是:
XEvent event; while (XPending (m_display)) { XNextEvent (m_display, &event); if (XFilterEvent (&event, None)) { continue; } switch (event.type) { case KeyPress: .. case ButtonPress: .. case Expose: .. case MapNotify: .. // etc } }
不过,这可以和你的无尽循环相结合。
但是,是逐像素绘制非常缓慢。 我甚至不想计算协议开销…:P