当前位置: 首页 > 面试题库 >

如何使用xlib创建游戏循环

曾修真
2023-03-14
问题内容

我正在尝试为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为例。



 类似资料:
  • 我是一个仍在学习Android系统的开发人员,到目前为止,我已经创建了两个应用程序,一个闹钟,一个小部件和一个使用数据库的通行证管理器,我有一点经验,但我想创建一个2D侧滚动游戏,我在网上查看,有不同的教程,但是,开始使用它的最佳方法是什么?我读过libgdx,但我不确定它是否过时。 我看到所有的游戏都是用Java制作的,然后移植到Android系统,这是正确的吗?我希望得到一些指导,谢谢!

  • 包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢

  • 本食谱演示了使用组合流来创建游戏循环的一种方式。本食谱旨在突出如何用响应式的方式来重新思考现有问题。在这个示例中,我们将提供整体循环以及自上帧以来的增量时间。与此相结合的是用户输入流,以及当前的游戏状态,我们可以用它来更新我们的对象,并根据每帧的发出来将其渲染到屏幕上。 示例代码 ( StackBlitz ) import { BehaviorSubject, Observable, of, fr

  • Unity empowers game designers to make games. What's really special about Unity is that you don't need years of experience with code or a degree in art to make fun games. There are a handful of basic w

  • 目前,我正在用python做一个失败的“ia”,它给了我一个最小最大成功率(使用lichess数据库的大师级部分)最好的开场,并且只采取至少已经打了100个位置的动作,这样就不会在一场比赛中落在100%的黑人成功率上。我设法用lichess api做到了这一点,问题是当我请求超过3个深度时,lichess会因为api上生成的垃圾邮件而阻止我。 我告诉自己,我要做同样的事情,但不是使用无衣api,我