Синхронизация нескольких окон OpenGL с vsync

В приложении Windows у меня открыто несколько окон OpenGL одновременно. В идеале я хотел бы, чтобы каждый из них рисовал со скоростью 60 кадров в секунду, синхронизированный с обновлением экрана.

Для каждого контекста рендеринга я звонюwglSwapIntervalEXT(1) включить всинк. Каждое окно имеет свой собственный поток отображения, который рисует кадр, а затем вызываетSwapBuffers обновлять.

Оказывается, что окна "боевые" друг друга: это выглядит какSwapBuffers вызовы синхронизируются и ждут друг друга, даже если они находятся в отдельных потоках. Я измеряю время покадрового изображения каждого окна и с двумя окнами, оно падает до 30 кадров в секунду, с трех до 20 кадров в секунду и т. Д.

Если я выключу vsync сwglSwapIntervalEXT(0)Они радостно обновляются со скоростью 60 кадров в секунду независимо от того, сколько окон я открываю. Но с одним открытым окном это не так гладко, как при включенном vsync.

Есть ли способ сделать то, что я хочу с OpenGL?

 Robinson07 апр. 2012 г., 14:01
Если вы думаете о проблеме, вы поймете, что они должны синхронизироваться друг с другом, если вы синхронизируете их все с частотой обновления. Нет уникального события обновления для каждого окна, которое вы видите. Единственное решение, которое я могу придумать (которое почти наверняка не является стартовым), - это использовать одно окно и создать внутри него собственный оконный менеджер, используя видовые окна.
 Frederik Slijkerman10 апр. 2012 г., 16:13
Если SwapBuffers просто сигнализирует о необходимости замены буферов, он может немедленно вернуться (пока не будет записан новый обратный буфер, который нужно будет заблокировать). Отдельный поток, принадлежащий драйверу дисплея, может затем ожидать vsync и поменять все буферы, помеченные как нужные для замены, в нужный момент. Однако, видимо, это не так, как все работает ...

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

В Linux в моих приложениях происходило много странного поведения из-за вызова функций видео из разных потоков.

Я решил эти проблемы, используя один поток только для отображения с момента запуска приложения, создания окна, создания glcontext и т. Д., И используя семафоры и очереди для обмена данными между этим потоком и другими.

Вы можете получить устройство вывода и использоватьWaitForVBlank функция в цикле из потока. Затем он может публиковать сообщения или сигнализировать о событиях для каждого интересующего вас окна.

 Frederik Slijkerman07 мая 2012 г., 10:39
Проблема в том, что я не контролирую другие окна OpenGL напрямую.

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