当前位置: 首页 > 知识库问答 >
问题:

如何在GLFW窗口中限制每秒帧数?(使用亲爱的ImGui)

秦焱
2023-03-14

目前,如果我的窗口足够小,我亲爱的ImGui应用程序(主要是带有一些自定义OpenGL渲染的演示窗口)运行速度大约为2000 fps。如何将此限制为监视器刷新率(甚至仅为60fps)?

我当前的代码如下所示:

static void glfw_error_callback(int error, const char * description)
{
    fprintf(stderr, "Glfw Error %d: %s\n", error, description);
}

int main(int, char **)
{
    // Setup window
    glfwSetErrorCallback(glfw_error_callback);
    if (!glfwInit())
        return 1;
    const char * glsl_version = "#version 150";
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // Required on Mac

    glfwWindowHint(GLFW_REFRESH_RATE, 60);

    // Create window with graphics context
    GLFWwindow * window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", NULL, NULL);
    if (window == NULL)
        return 1;
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);  // Enable vsync

    bool err = gl3wInit() != 0;
    if (err) {
        fprintf(stderr, "Failed to initialize OpenGL loader!\n");
        return 1;
    }

    // Setup Dear ImGui binding
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGuiIO & io = ImGui::GetIO();
    (void)io;
    // io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;  // Enable Keyboard Controls

    ImGui_ImplGlfw_InitForOpenGL(window, true);
    ImGui_ImplOpenGL3_Init(glsl_version);

    // Other stylistic setup
    ...

        while (!glfwWindowShouldClose(window))
    {
        glfwPollEvents();
        // Create ImGui Windows
        // Rendering
        ImGui::Render();
        int display_w, display_h;
        glfwMakeContextCurrent(window);
        glfwGetFramebufferSize(window, &display_w, &display_h);
        glViewport(0, 0, display_w, display_h);
        glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
        glClear(GL_COLOR_BUFFER_BIT);
        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

        glfwMakeContextCurrent(window);
        glfwSwapBuffers(window);
    }

    // Cleanup
    return 0;
}

如您所见,它与ImGui示例中给出的GLFW和OpenGL 3的原始示例代码没有任何区别(几乎没有任何区别),除了我使用glfwWindowHint(GLFW_REFRESH_RATE,60)限制刷新率的尝试没有成功,我了解到这只会影响全屏模式下的窗口。此外,我认为glfwSwapInterval(1)也可能会将刷新率限制为显示器的刷新率,但它似乎也没有这样做。非常感谢任何帮助。

编辑:GLFW错误函数和加载。

共有1个答案

归明诚
2023-03-14

设置glfwSwapInterval(0);删除framecap。

 类似资料:
  • 如何使亲爱的ImGui创建的窗口完全适合“背景”?我的意思是当我们创建一个窗口时,它也在一些渲染场景或背景中。我想模仿Qt等其他框架创建的窗口,使其更像桌面应用程序,而不仅仅是在一些游戏中。

  • 提前谢了。

  • 我有以下代码: 它在我的Ubuntu和视窗桌面上都能正常工作,但在我运行OSX的笔记本电脑上却失败了。我认为笔记本电脑不支持这个版本的OpenGL是个问题,但它支持高达4.1的显卡。 我认为它可能使用集成的intel GPU而不是英伟达GPU,但据我所知,GLFW将强制使用正确的GPU进行渲染。 如果我将上下文更改为2.1,一切似乎都正常,但着色器不兼容。 有什么想法吗? 更新:如果删除了所有调用

  • 我对glfw有一个小问题。 我的代码非常简单,我只想创建一个空窗口。 } 此代码编译,但当我运行它时,我只有一个白色窗口。窗口的标题是正确的,但里面的一切都是白色的......我尝试像那样使用glClearColor。 但是我的窗户仍然是白色的....我用的是visual studio 2015。 怎么弄个黑窗? 编辑: 忘了补充这个:glfwMakeContextCurrent(window);

  • 我有以下数据: 现在我想以这样一种方式过滤数据,我可以删除第6行和第7行,对于特定的uid,我想在代码中只保留一行值为'c' 所以预期的数据应该是: 我使用的窗口函数如下所示: