【问题标题】:SDL2 and OpenGL, forcing FPS with Vsync disabled?SDL2 和 OpenGL,强制禁用 Vsync 的 FPS?
【发布时间】: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


【解决方案1】:

所以我想通了,原来我的驱动程序设置了强制 Vsync 是导致此问题的原因,我感到困惑,因为我认为 Vsync 只会在交换缓冲区时强制延迟,但显然不是这样,因为解释here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 2016-04-10
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多