我正在尝试为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绘制比使用所有像素循环更快的方法吗?双缓冲不应该解决这个问题,还是我不正确地实现它?
答案 0 :(得分:3)
直接与Xlib进行沟通是在90年代早期(阅读:没有人这样做,除非他是过去20年的框架设计师!)。
你是对的,循环显示像素以在屏幕上更新它们难以置信慢。这就是为什么几乎所有现代GUI框架都使用他们自己的Xbuffers,他们只是绘制并指示X渲染。
作为对您的方法的评论: 原始X上的游戏开发并没有什么意义,因为有更多可用,性能更好,更易于使用,小巧,经过良好测试的库。以SDL为例。