SDL2和OpenGL,强制FPS与垂直同步禁用

SDL2 and OpenGL, forcing FPS with Vsync disabled?

本文关键字:垂直 同步 FPS OpenGL 强制 SDL2      更新时间:2023-10-16

我遇到了一个问题,一些OpenGL函数似乎迫使我的应用程序运行60fps。我使用SDL2并指定

SDL_GL_SetSwapInterval(0)

在初始化时,我认为它禁用了垂直同步。例如,下面一行代码每次将返回16毫秒(假设这是我在循环中运行的唯一代码,如果我之前以类似的方式在屏幕上绘制了一些东西,则运行该函数将花费16毫秒,而这一行将以微秒而不是毫秒为单位):

Uint32 begin = SDL_GetTicks();
GLint lightBuffer = glGetUniformLocation(cNight_shader.gProgramID, "lightBuffer");
GLint varying_time = glGetUniformLocation(cNight_shader.gProgramID, "varying_colour");
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, texColorBuffer);
glUseProgram(cNight_shader.gProgramID);
glUniform1i(lightBuffer, 2);
glUniform1f(varying_time, cNight_shader.f1);
draw_quad(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); // (0, 0, myTexture);
glUseProgram(NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture(GL_TEXTURE0);
Uint32 end = SDL_GetTicks();
std::cout << end - begin << std::endl;

如果有任何帮助,我将不胜感激。我还想指出,如果我不使用任何着色器或缓冲区,只是做一个简单的:

glBindTexture(GL_TEXTURE_2D, texture_id);
draw quad();
glBindTexture(GL_TEXTURE_2D, 0);

这并不强制FPS,所以我认为这个问题与我的着色器有关,但我不明白为什么。

所以我弄清楚了,原来我的驱动程序已经设置了强制的Vsync,这导致了这一点,我很困惑,因为我认为Vsync只会在交换缓冲区时强制延迟,但这显然不是这种情况,正如这里解释的那样。