Есть ли способ снять ограничение 60 кадров в секунду в GLFW?

Я пишу игру с OGL/GLFW на С++.

Моя игра всегда работает со скоростью 60 кадров в секунду и без разрывов экрана. После некоторых исследований кажется, что функция glfwSwapInterval() должна иметь возможность включать/отключать вертикальную синхронизацию или ограничение 60 кадров в секунду.

Однако независимо от значения, которое я передаю функции, частота кадров остается заблокированной на уровне 60, и разрывов нет вообще. Я также проверил настройки композитора в Linux и на панели nvidia, и они не действуют.

Я предполагаю, что это обычная вещь, есть ли способ обойти это ограничение частоты кадров?


person Manu    schedule 18.05.2018    source источник
comment
Возможно, в вашем драйвере графического процессора включена жесткая вертикальная синхронизация. Найдите, как отключить его у любого поставщика, и посмотрите, разблокирует ли он частоту кадров.   -  person ricco19    schedule 18.05.2018
comment
10 секунд гугления (GLFW vsync) привели меня к этому: glfw.org/docs /latest/ — способ узнать о реализации расширений, связанных с поддержкой разрывов, в ваших реализациях GLFW. Когда вы назвали его, что там было сказано о поддержке этих расширений?   -  person Yakk - Adam Nevraumont    schedule 18.05.2018
comment
@ ricco19 Я уже пробовал это, вертикальная синхронизация в моем драйвере отключена, но все равно спасибо.   -  person Manu    schedule 18.05.2018
comment
@Yakk-AdamNevraumont Я пробовал с GLX_EXT_swap_control, и результат был верным. Я так понимаю, это означает, что можно использовать управление подкачкой, но разве это не должна быть строка glfwSwapInterval(), которую я пробовал раньше?   -  person Manu    schedule 18.05.2018
comment
glfwSwapInterval(0) будет программным способом, если вам не нужно переопределять его непосредственно в панели управления драйвером (GPU).   -  person Brett Hale    schedule 19.05.2018
comment
Хорошо всем, спасибо за все ваши ответы. Я понял, как это решить в конце концов. Похоже, что установка glfwSwapInterval на 0 или 1 или другое число больше 1 просто включает/отключает его, полностью делая его бесполезным для цели vsync. Однако установка его на 0,5 указывает glfw удвоить ограничение частоты кадров до удвоенной частоты обновления экрана (в моем случае 120 кадров в секунду), а также отключает вертикальную синхронизацию. Итак, что я сделал, чтобы это заработало, так это поэкспериментировал с glfwSwapInterval(), изменив значение от 0 до 1. Надеюсь, это поможет тем, кто впоследствии найдет эти сообщения.   -  person Manu    schedule 23.05.2018
comment
@Manu использует glfwSwapInterval(0), но вызывает эту функцию сразу после вызова glfwMakeContextCurrent   -  person Eugen1344    schedule 18.04.2019


Ответы (1)


Есть ли способ снять ограничение 60 кадров в секунду в GLFW?

Самый простой способ — использовать одинарную буферизацию вместо двойной буферизации. Поскольку при одиночной буферизации всегда используется один и тот же буфер, нет подкачки буфера и нет «vsync».

Используйте glfwWindowHint, чтобы отключить двойную буферизацию:

glfwWindowHint( GLFW_DOUBLEBUFFER, GL_FALSE );
GLFWwindow *wnd = glfwCreateWindow( w, h, "OGL window", nullptr, nullptr );

Обратите внимание: когда вы используете одиночную буферизацию, вам необходимо явно указать принудительное выполнение команд GL с помощью (glFlush), вместо замены буфера (glfwSwapBuffers).


Другая возможность – установить количество обновлений экрана, которые будут ожидаться с момента glfwSwapBuffers был вызван перед заменой буферов на 0. Это можно сделать с помощью glfwSwapInterval после того, как контекст OpenGL станет текущим (glfwMakeContextCurrent):

glfwMakeContextCurrent( wnd );
glfwSwapInterval( 0 );

Но обратите внимание, работает ли это решение или нет, может зависеть от оборудования и драйвера.

person Rabbid76    schedule 19.05.2018