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

Posted

技术标签:

【中文标题】如何在 GLFW 窗口中限制我的每秒帧数? (使用亲爱的 ImGui)【英文标题】:How do I limit my Frames Per Second in a GLFW window? (Using Dear ImGui) 【发布时间】:2019-01-22 16:49:13 【问题描述】:

目前,如果我的窗口足够小,我亲爱的 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 错误函数和加载。

【问题讨论】:

你试过吗? glfwSwapInterval(10); 出于调试原因? 这似乎没有任何改变。它仍然是无限的。我注册了 glfw 的错误函数,但没有收到任何错误。 对于所有看到这个的人(包括@Rabbid76),我发现这实际上是 GFLW 和 Mac OSX 10.14 (Mojave) 的最新问题。看起来有一个拉取请求,但在它被合并并且一切运行正确之前,我只是将这个问题保持开放。 github.com/glfw/glfw/issues/1337 作为最后的资源,可以存储上一次循环运行的时间,如果当前运行的圈数不够大,则全部跳过。 【参考方案1】:

设置 glfwSwapInterval(0);移除框架帽。

【讨论】:

以上是关于如何在 GLFW 窗口中限制我的每秒帧数? (使用亲爱的 ImGui)的主要内容,如果未能解决你的问题,请参考以下文章

如何在opencv中计算每秒帧数?

为啥在 GLFW 窗口中使用此代码在我的屏幕上没有绘制立方体?

如何将运动物理函数缩放到每秒帧数(在游戏引擎中)?

帧数和每秒帧数是一样的吗?

iOS AVFoundation 如何使用 CMTime 转换每秒相机帧数以创建延时摄影?

在 OpenGL 中实例化数百万个对象:提高每秒帧数