Как создать игровой цикл с помощью 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, чем просто цикл по всем пикселям? Разве двойная буферизация не должна решать эту проблему, или я неправильно ее реализую?