Как включить VSYNC в OpenGL - PullRequest
       50

Как включить VSYNC в OpenGL

3 голосов
/ 18 января 2010

Расширение WGL_EXT_swap_control позволяет делать это в Windows, но я не могу найти ничего, даже удаленно кроссплатформенного, делающего то же самое, то есть синхронизировать мои замены буфера с обновлением экрана. Мое приложение использует GLEW, поэтому что-то из предложенного было бы предпочтительным. Кросс-платформенная поддержка для Linux, Mac и Windows необходима, но мое приложение не сломается, если синхронизация не может быть установлена ​​(например, пользователь отключил ее в своих графических драйверах).

Я приму программный код для этого на многих платформах с GLEW в качестве правильного ответа.

Ответы [ 4 ]

6 голосов
/ 20 января 2010

Есть причина, по которой нелегко найти кроссплатформенное решение. Платформа в конечном итоге владеет дисплеем (и режимом обмена). Так что это обязательно является частью API платформы (если выставлено). Не может быть кросс-платформенного решения. Даже у glew есть некоторые специфичные для платформы биты, когда дело доходит до взаимодействия с платформой.

Теперь вы можете утверждать, что все платформы должны использовать один и тот же API для этого конкретного бита их интерфейса, но я сомневаюсь, что вы получите от них какую-то поддержку.

Последнее, не все кадровые буферы отображаются напрямую. Если вы используете систему управления окнами, которая фактически смешивает пиксели кадрового буфера с рабочим столом (как это делает Aero, когда активен), то вы все равно не сможете контролировать поведение подкачки.

Для справки, различные API для этого на основных платформах:

  • wglSwapIntervalEXT
  • glXSwapIntervalSGI
  • AGLSetInteger
1 голос
/ 26 февраля 2010

С http://www.opengl.org/wiki/Swap_Interval (и косвенно http://www.opengl.org/registry/specs/SGI/swap_control.txt):

В Linux все намного проще. Если GLX_SGI_swap_control присутствует в строка, возвращаемая glGetString(GL_EXTENSIONS), тогда вы можно использовать glXSwapIntervalSGI(0) для отключить vsync или вы можете использовать glXSwapIntervalSGI(1) для включения vsync (ака вертикальная синхронизация).

0 голосов
/ 07 декабря 2011

Для OS X, проверьте http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSOpenGLContext_Class/Reference/Reference.html

NSOpenGLCPSwapInterval

Устанавливает или получает интервал обмена. Своп интервал представлен как один длинный. Если интервал обмена установлен на 0 (по умолчанию), метод flushBuffer выполняется как можно скорее, без учета вертикальной частоты обновления монитора. Если интервал обмена установлен в 1, буферы меняются только во время вертикальный обратный ход монитора. Доступный в Mac OS X v10.0 и позже.

Объявлено в NSOpenGL.h.

0 голосов
/ 18 января 2010

Это звучит довольно неприятно и заставляет вас думать, какой вызов идет в Mac OS X, но этот парень , похоже, нашел какое-то решение.

...