【发布时间】:2015-09-20 14:11:45
【问题描述】:
我正在尝试为 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 绘图的方法?双缓冲不应该解决这个问题,还是我执行不正确?
【问题讨论】: