Как создать игровой цикл с помощью 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, пиксели, gc определены глобально.

Теперь, когда я компилирую и выполняю двоичный файл, строки с низкой координатой y в основном синие, но строки с высокой координатой y в основном белые. Между ними легко увидеть, как просто требуется слишком много времени для рисования всех пикселей одновременно. Я ожидаю, что этот эффект объясняется тем, что сначала отображаются верхние строки (низкий y), что означает небольшую задержку между XClearWindow () и XDrawPoint () для этих пикселей. (Я также проверил fps, для выполнения цикла while (true) один раз требуется около 7 миллисекунд.)

Я провел некоторое исследование и прочитал о том, как двойная буферизация может решить эту проблему. Я следовал руководству по двойной буферизации с помощью xlib (Xdbe), но, похоже, это не решило проблему. Есть ли более быстрый способ рисования с помощью xlib, чем просто цикл по всем пикселям? Разве двойная буферизация не должна решать эту проблему, или я неправильно ее реализую?

Ответы на вопрос(2)

Ваш ответ на вопрос