Как предотвратить разрыв экрана с помощью OpenGL + GLFW? - PullRequest
1 голос
/ 16 апреля 2020

Я работаю над графическим приложением, которое поддерживает несколько операционных систем и графические серверные части. Окно создается с помощью GLFW, а графический API выбирается во время выполнения. При запуске программы на windows и использовании OpenGL, Vsyn c кажется сломанным. Частота кадров зафиксирована на уровне 60 кадров в секунду, однако появляются артефакты разрыва экрана. Следуя документации GLFW, glfwSwapInterval(0); должен разблокировать частоту кадров по умолчанию при использовании VSyn c. Это работает, как ожидалось. Использование glfwSwapInterval(1); должно блокировать частоту кадров, чтобы соответствовать показателю refre sh для мониторов. Не вызывать glfwSwapInterval(); вообще следует по умолчанию использовать VSyn c. Несмотря на то, что частота кадров правильно блокируется / разблокируется с помощью этих вызовов, я столкнулся с чрезвычайно интересным поведением.

Когда glfwSwapInterval(); вообще не вызывается, VSyn c устанавливается по умолчанию. Но ожидание следующего кадра происходит при первом вызове! Казалось бы, задержка для следующего кадра произойдет на glfwSwapBuffers(). На экране нет видимых артефактов.

При вызове glfwSwapInterval(1); устанавливается Vsyn c, и задержка для следующего кадра происходит на glfwSwapBuffers()! Это здорово, однако, при явной настройке VSyn c появляются артефакты разрыва экрана.

Прямо сейчас, не вызывая glfwSwapInterval() для использования VSyn c, кажется хакерским решением, но:

  • Пользователь не сможет отключить VSyn c без восстановления окна,
  • Профилировщик определяет, что первый вызов отрисовки выполняется слишком долго, поскольку время ожидания VSyn c несколько что происходит там.

Я попытался поиграться с настройками драйвера GPU и протестировать код на нескольких машинах. При использовании windows и OpenGL проблема сохраняется на всех машинах.

Если кто-то может в этом разобраться, поделитесь, или, если я что-то неправильно понимаю, я был бы очень признателен за некоторые указатели в правильном направлении.

РЕДАКТИРОВАТЬ: некоторые другие детали: разрыв происходит на определенной c горизонтальной линии. Кажется, что остальная часть кадра работает правильно.

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

...