【发布时间】:2016-12-30 22:09:57
【问题描述】:
我遇到了一些 OpenGL 函数似乎强制我的应用程序以 60fps 运行的问题。我正在使用 SDL2 并指定
SDL_GL_SetSwapInterval(0)
在初始化期间,我认为禁用了 Vsync。例如,以下代码行每次将返回 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,所以我认为问题与我的着色器有关,但我不明白为什么。
【问题讨论】:
-
你试过
SDL_SetHintWithPriority(...)吗? Here Reference。创建渲染器之前:SDL_SetHintWithPriority(SDL_HINT_RENDER_VSYNC, "0", SDL_HINT_OVERRIDE); -
@BiagioFesta:
SDL_HINT_RENDER_VSYNC仅适用于 SDL Renderer 系统,不适用于 OpenGL。 -
glUseProgram(NULL);NULL 并不总是计算出方法所期望的整数 0。 -
谢谢!我不完全确定为什么它在那里设置为 NULL,每次我使用它时我都将它设置为 0。至于我的实际问题,这是我自己的白痴情况,我的驱动程序被设置为强制垂直同步。我很困惑,因为我认为 vsync 会在交换缓冲区时强制延迟,但显然我错了,它似乎在交换缓冲区后第一次尝试绘制时强制延迟。
-
@SurvivalMachine:在 OP 合理使用的任何系统上,它将评估为整数 0。这些异常充其量是晦涩难懂的,谁知道 SDL 是否可以在任何此类系统上运行。
标签: c++ opengl frame-rate