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

l3zydbqr  于 2022-10-18  发布在  其他
关注(0)|答案(2)|浏览(358)

目前,如果我的窗口足够小,我的亲爱的ImGui应用程序(主要是带有一些自定义OpenGL渲染的演示窗口)的运行速度约为2000fps。我如何才能将其限制在显示器刷新率(甚至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)来限制刷新率的尝试失败了,我了解到glfwWindowHint(GLFW_REFRESH_RATE, 60)只影响全屏模式下的窗口。此外,我还认为glfwSwapInterval(1)可能还会将刷新率限制为显示器的刷新率,但它似乎也没有做到这一点。任何帮助都将不胜感激。
编辑:GLFW错误函数和加载。

aiazj4mn

aiazj4mn1#

设置glfwSwapInterval(0);将删除Framecap。

6za6bjd0

6za6bjd02#

对于正在寻找限制帧速率的方法的人来说:
您可以运行如下所示的延迟函数

void delay()
{
    auto start = std::chrono::high_resolution_clock::now();
    auto stop = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
    while (true)
    {
        stop = std::chrono::high_resolution_clock::now();
        duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
        if (duration.count() >= 20000)
        {
            return;
        }
        else
            continue;
    }
}

在imgui主循环中,可能还有另一种方法,但我发现这种方法非常方便。

相关问题