Использование SwapBuffers() с несколькими холстами OpenGL и вертикальной синхронизацией?

У меня есть графический интерфейс, написанный с использованием wxPython, который содержит два GLCanvases, холст 'display' и холст 'preview', на котором я рисую очень простую геометрию, используя PyOpenGL. Поля 'preview' и 'display' отображают содержимое одного и того же кадрового буфера:

введите описание изображения здесь

Мне нужно, чтобы оба этих полотна были обновлены синхронно с постоянной частотой кадров без разрывов.

Пока я только что звонил

self.SetCurrent()
# draw stuff...
self.SwapBuffers()

для предварительного просмотра и отображения холстов в моем цикле рендеринга. Это работает достаточно хорошо при условии, что я отключил vsync в настройках моего драйвера.

Однако, если я включаю vsync, моя частота кадров падает до ~30 Гц, что составляет половину вертикальной частоты обновления моего дисплея. Предположительно это происходит потому, что выполнение цикла рендеринга останавливается на каждом SwapBuffers() вызов в ожидании следующего вертикального обновления - если я закомментирую один из двух SwapBuffers() звонки, моя частота кадров возвращается к 60 Гц, но тогда, конечно, только один из моих полотен обновляется.

То, что я действительно хотел бы, чтобы оба моих холста обновлялись синхронно, один раз за интервал vsync. Есть ли способ, которым я могу достичь этого, используя wx.glcanvas.GLCanvas учебный класс?

1 ответ

Решение

В своем комментарии Андон подразумевает, что вы используете {wgl|glX}SwapInterval, чтобы установить интервал подкачки для первого, синхронизируя SwapBuffers на 1, а затем сразу после возврата SwapBuffers для синхронизации установите интервал подкачки на 0 и выполните другие операции SwapBuffers.,

Другие вопросы по тегам