Заметки / Подвисание OpenGL-приложений

VSync, Stuttering
 OpenGL-приложения, работающие без проблем на старых компьютерах и видеокартах, могут тормозить на более новом "железе". Эта проблема связана с вертикальной синхронизацией кадров: подстройкой видеокарты под частоту обновления дисплея. С одной стороны, это снижает нагрузку в приложениях без задержек (в виде Sleep'а) и позволяет более оптимально расходовать ресурсы, с другой - создаёт трудности в расчёте движения объектов сцены. Раньше в программах расстояние смещения при движении рассчитывалось на основе времени с момента формирования предыдущего кадра. Таким образом скорость перемещения объектов была одинаковой и на частоте, например, 15 FPS и на 60 FPS. Просто на меньших FPS видео было более прерывистым, а на высоких - плавным. Сейчас данный подход перестал работать. Связано это с тем, что время формирования изображения и время его показа на экране - не совпадают. Поэтому подобрать точный коэффициент для смещения и вращения объектов не получится. Выходом может стать отказ от коэффициентов смещения - ведь видеокарта выдаёт постоянное количество FPS и значит можно ничего не подстраивать. К сожалению, это не всегда так. При кратковременных повышениях нагрузки на систему частота FPS может незначительно проседать и этого оказывается достаточно, чтобы плавность потерялась - появляются едва заметные подвисания. К примеру, в моих приложениях на OpenGL таким фактором стало проигрывание звуков.

Видео из тестовой версии Walker'а. Небольшое подтормаживание:

Пока не знаю полного решения данной проблемы.

Примечания:
  • отключение VSync на современной видеокарте не поможет. Приложение начинает тормозить и работает не так плавно, как на более старых видеокартах;
  • при работе с включённым VSync'ом, чтобы добиться эффекта плавного движения, нужно отключить Sleep'ы, выставить постоянный коэффициент для перемещения объектов и исключить дополнительную нагрузку, например в виде проигрывания звуков в параллельных потоках.
09.06.2021