Я создаю модуль, который должен отображать изображения с определенной скоростью (не заданной заранее, но не очень высокой — максимум 10 Гц для обмена изображениями).
Из моего исследования я пришел к выводу, что QGLWidget является подходящим инструментом для этой задачи после включения vsync с вызовами openGL (семейство SwapInterval).
Тем не менее, я не уверен, как на самом деле реализовать механизм обмена — я должен использовать таймер? Если я установлю таймер на 333,3 мс (3 Гц), когда частота обновления составляет 60 Гц (16,67 за такт, таким образом, таймер составляет 20 циклов), и я буду уверен, что синхронизация будет в порядке? И если частота должна быть 9 Гц, мне нужно установить таймер на 100 + 16,67, потому что это лучшее, что я могу получить?
И если таймер в порядке, я должен просто вызвать paintGL (), когда он отправляет мне событие тайм-аута?
Спасибо
я должен использовать таймер?
Да, но не наивно. Если вы просто используете таймер для точного определения представления изображений, частота вашего таймера будет бить против дисплея V-Sync / обновление генератора — программные таймеры работают от источника синхронизации, отличного от дисплея.
Это избиение приведет к пропущенным интервалам обмена, которые будут восприниматься как заикание кадра.
Вместо этого вы должны сделать следующее: Используйте V-Synced буфер подкачки (SwapBuffers¹) в качестве контрольной точки, чтобы начать время высокой точности измерение таймер.
Затем визуализируйте кадр для следующего времени презентации в будущем, к которому вы стремитесь; Примите во внимание, что интервалы между кадрами входят в гранулярность интервала обновления дисплея — если только не используются G-Sync или FreeSync. использование glFinish
чтобы принудительно завершить процесс рендеринга кадра, затем остановите таймер и определите, сколько времени потребовалось для рендеринга кадра. Если кадр был завершен раньше, чем период обновления, на который вы нацелены, добавьте (задержка с высоким разрешением), которая задерживает вашу программу на целевой период отображения (нацеливание на середину периода), после чего следует SwapBuffers
которая будет ориентиром для следующей итерации.
Ответ: Это будет надежно работать только для карт Nvidia и AMD и их проприетарных драйверов. Драйверы для графических процессоров Intel имеют другое временное поведение.
Других решений пока нет …