c++ - 如何使用 xlib 创建游戏循环

标签 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 绘图的方法?双缓冲不应该解决这个问题,还是我实现不正确?

最佳答案

您没有看到任何内容的原因是您忽略了 X 事件循环。您所做的只是将数据发送到 X 服务器,但 X 服务器无法返回通信。

您必须设置一个循环,从队列中读取 XEvent 并派发 c.q。处理。像这样的东西:

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
  }
}

不过,这可以与无限循环结合使用。

但是,是的,逐像素绘制非常慢。我什至不想计算协议(protocol)开销...:P

关于c++ - 如何使用 xlib 创建游戏循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32680312/

相关文章:

opengl - 谁能解释一下 "Khronos stack"技术组合在一起的方式?

c - 使用 X11 渲染文本时如何添加换行符,

c++ - 在 C++ 中找不到相同的旧标识符错误

c++ - 非数字输入检查

c++ - 理解模板参数推导

c++ - 构建失败错误 : Cannot build C++ SDK Helloworld with qibuild

c++ - 无法使用 C++ 连接到 Access 数据库

c++ - 在 Linux ARM 上编译不支持 GUI 的 Qt5

android - 总是恢复到旧版本

c - 如何使用 xlib 获取现有窗口的显示结构