Я работаю над графическим приложением, которое поддерживает несколько операционных систем и графические серверные части. Окно создается с помощью 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 горизонтальной линии. Кажется, что остальная часть кадра работает правильно.
После еще нескольких тестов кажется, что все работает так, как задумано для встроенной графики. Поправьте меня, если я ошибаюсь, но похоже, что это проблема с графическим драйвером.