Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Отключение вертикальной синхронизации - Vsync


Автор: Oldshelf 21.5.2021, 09:35
Заметил небольшое торможение в своих программах на OpenGL. Проявляется на современной видеокарте NVidia. Причём сцена строится вроде бы нормально, небольшой фриз и потом снова нормальный рендеринг. Кажется, дело в вертикальной синхронизации. При любых Sleep'ах между SwapBuffers даётся стабильно 60 FPS. Пробовал подключать заголовочный файл "wglext.h" и использовать этот код:
Код

// https://www.gamedev.ru/tip/?id=85
typedef BOOL (APIENTRY * wglSwapIntervalEXT_Func)(int);
wglSwapIntervalEXT_Func wglSwapIntervalEXT =
  wglSwapIntervalEXT_Func(wglGetProcAddress("wglSwapIntervalEXT"));
if(wglSwapIntervalEXT) wglSwapIntervalEXT(0); // 1 - чтобы включить

Но эффекта не получил. Причём пример работает, при установке wglSwapIntervalEXT(2) - частота кадров снижается вдвое, но выше 60 не поднимается, даже со Sleep (1) или usleep (1)... Отключил Sleep вообще и видеокарта выдала 800-1000 FPS без замедлений.

Вопрос. Можно ли избавиться от едва заметных подвисаний, не используя ресурсы на полную?

Автор: Oldshelf 3.6.2021, 11:41
Проблема давно известна и называется "stuttering". В случае с однопоточным приложением решается установкой wglSwapIntervalEXT(1), отключением Sleep'ов и подстройки перемещений/вращений в зависимости от FPS (вместо этого нужно указать постоянный коэффициент, зависящий от частоты обновления дисплея).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)