Wie erstelle ich eine Spieleschleife mit xlib

Ich versuche, eine Spieleschleife für ein xlib-Fenster zu erstellen, kann das Fenster jedoch nicht richtig zeichnen. Im Moment erstelle ich ein Fenster mit XCreateSimpleWindow (...) und benutze eine for-Schleife, um alle Pixel nacheinander zu zeichnen. (Die Farbe dieser Pixel wird aus einem großen Integer-Array gelesen, für den Moment habe ich alle Pixel auf Blau gesetzt.) Die eigentliche Spieleschleife ist im Moment die folgende:

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();
    }
}

Die Variablen dsp, win, pixels, gc sind global definiert.

Wenn ich jetzt die Binärdatei kompiliere und ausführe, sind die Zeilen mit der niedrigen y-Koordinate größtenteils blau, aber die Zeilen mit der hohen y-Koordinate sind größtenteils weiß. Dazwischen ist leicht zu erkennen, dass es einfach zu lange dauert, alle Pixel auf einmal zu zeichnen. Ich gehe davon aus, dass dieser Effekt darauf zurückzuführen ist, dass die oberen Zeilen (niedriges y) zuerst gezeichnet werden, was eine kurze Verzögerung zwischen XClearWindow () und XDrawPoint () für diese Pixel bedeutet. (Ich habe auch die fps getestet, es dauert ungefähr 7 Millisekunden, um die while (true) -Schleife einmal auszuführen.)

Ich habe einige Nachforschungen angestellt und gelesen, wie dieses Problem durch Doppelpufferung behoben werden kann. Ich habe eine Anleitung zum Doppelpuffern mit xlib (Xdbe) befolgt, aber sie scheint das Problem nicht zu lösen. Gibt es eine schnellere Möglichkeit, mit xlib zu zeichnen, als einfach alle Pixel zu durchlaufen? Soll das durch Doppelpufferung nicht gelöst werden oder setze ich es falsch um?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage