2013-09-17 8 views
1

У меня есть четыре окна на одной системе отображения, каждая из которых имеет свой собственный контекст и свой собственный доступный (сохранение двух из них является дочерним для одного другого). Я хочу синхронизировать процесс замены буфера этих окон, который он будет выполнять в одно и то же время. Быстрый поиск дает мне эти возможные альтернативы.Синхронизация буфера обмена

  • GLX_SGIX_swap_group: Доступно только для системы X11.
  • NV_swap_group (WGL_NV_swap_group/GLX_NV_swap_group): Доступно только на графических процессорах Quadro с поддержкой поддержки рамной резки.
  • GLX_OML_sync_control: Предлагаем управление синхронизацией с помощью счетчика, предлагаемого на vsync и swap, но может потребовать дополнительной настройки, чтобы реализовать его для групповой замены. Также недоступна система NV и fglrx (?), Но имеет поддержку как для системы Window, так и для X11.

Кажется, что у каждого есть свои ограничения, особенно с точки зрения аппаратной поддержки. Я прочитал, что Синхронизация программного обеспечения также возможна, например, своп-барьер, предлагаемый в Equalizer? Возможно ли иметь указатель на то, как можно реализовать? Или, если есть альтернативы, я могу перенаправить?

+0

Есть ли причина, по которой вы не хотите использовать одно окно с четырьмя различными видовыми экранами? – fintelia

+0

Визуальный для каждого окна отличается, @fintelia. :) – null

+0

Вы можете нарисовать несколько разных сцен в одном окне, если вы используете отдельные видовые экраны для каждого из них. – fintelia

ответ

0

Одним из возможных решений является включение Wait для VBlank для всех окон (это предполагает, что все окна находятся на одном и том же или синхронизированные дисплеи), и вручную синхронизирует вызов SwapBuffer. Этот подход не является 100% -ным водонепроницаемым (поскольку команда обмена буфером может быть выпущена очень близко к фактическому «siwchch» кадра, а некоторые потоки выполняют его, а некоторые другие пропускают его, но это очень маловероятно и только временный сбой, поскольку «поздние» потоки будут задерживать «ранние» в последнем кадре, а синхронизация восстанавливается).

Чтобы реализовать это, вы можете использовать простой барьер. Просто не забудьте вручную очистить трубопровод GL, чтобы работа была действительно выполнена, и SwapBuffers можно выполнить немедленно. Вся каждая нить должна делать в конце кадра: glFinish() и ждать барьера. Как только все нити достигли барьера, они сразу же выпустили SwapBuffers().

+0

Не могли бы вы подробнее рассказать о барьерах? :) Я знаю только, что существует SGIX_swap_barrier, но в документе указано, что ему нужна SGIX_swap_group. – null

+0

@ S.Aymerich: для этого вам не требуется специальное расширение GL. Я имею в виду базовую концепцию [барьера как метода синхронизации] (http://en.wikipedia.org/wiki/Barrier_%28computer_science%29).Существует множество способов его реализации, и они полностью не связаны с OpenGL. Как реализовать это в вашем случае зависит от вашей операционной системы и/или языка программирования. – derhass

+0

Ах! Теперь я понимаю. Я посмотрю на PThreads и его реализацию и посмотрю, как это происходит. Спасибо. :) – null

0

Если допустимо только одно окно, вы можете использовать отдельные видовые экраны для визуализации каждого из видов. Например:

glClear(...); 

glViewport(x1, y1, width1, height1); // all coordinates are in pixels 
// draw scene 1 

glViewport(x2, y2, width2, height2); 
// draw scene 2 

glViewport(x3, y3, width3, height3); 
// draw scene 3 

SwapBuffers(...); // actual method depends on your environment 
Смежные вопросы