GLFW民意调查等待窗口调整大小完成,如何解决?

cjf*_*ure 5 c++ window glfw

我正在研究GLFW应用程序,我在调整窗口大小时发现了一个问题.

当用户缩放窗口时,该glfwPollEvents()功能会一直等到用户完成.这意味着,在缩放窗口期间,不会调用渲染函数,并且会创建可怕的伪像.

我通过从主循环调用render函数以及窗口调整大小回调来解决这个问题:

#include <GLFW/glfw3.h>

static void render(GLFWwindow* window) {
    glfwMakeContextCurrent(window);

    glClear(GL_COLOR_BUFFER_BIT);

    glfwSwapBuffers(window);
}

static void window_size_callback(GLFWwindow* window, int width, int height) {
    render(window);
    glViewport(0, 0, width, height);
}

int main(void) {
    if (!glfwInit()) {
        return -1;
    }

    GLFWwindow* window = glfwCreateWindow(640, 480, "Terrain chunk render", NULL, NULL);
    if (!window) {
        glfwTerminate();
        return -1;
    }

    glfwSetWindowSizeCallback(window, window_size_callback);

    while (!glfwWindowShouldClose(window)) {
        render(window);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,这意味着当用户在缩放窗口而不实际移动窗口之后按住鼠标按钮时,不会调用渲染功能.有没有一种有效的方法来解决这个问题并使渲染函数更加一致?

Ale*_*lex 5

使用两个线程,一个用于轮询事件,一个用于渲染。您可能还想使用glfwWaitEventsint 而不是glfwPollEvents阻塞事件线程,直到事件可用。


Fro*_*bi3 1

您应该将 移动glfwSetWindowSizeCallback(window, window_size_callback);到 while 循环中,以便在调整窗口大小时调用渲染函数。很久以前我也遇到过同样的问题。

编辑:不建议在循环中设置回调。只需要在调整窗口大小时重新绘制框架即可。