C++ GLFW轮询等待窗口大小调整完成,如何修复?

C++ GLFW轮询等待窗口大小调整完成,如何修复?,c++,window,glfw,C++,Window,Glfw,我正在开发一个GLFW应用程序,在调整窗口大小时发现了一个问题 当用户缩放窗口时,glfwPollEvents()函数将等待用户完成。这意味着,在缩放窗口期间,不会调用渲染函数,并且会创建可怕的瑕疵 我通过从主循环调用render函数以及窗口大小回调来解决这个问题: #include <GLFW/glfw3.h> static void render(GLFWwindow* window) { glfwMakeContextCurrent(window); glC

我正在开发一个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;
}
#包括
静态空心渲染(GLFWwindow*窗口){
glfwMakeContextCurrent(窗口);
glClear(GLU颜色缓冲位);
glfwSwapBuffers(窗口);
}
静态无效窗口\大小\回调(GLFWwindow*窗口,整型宽度,整型高度){
渲染(窗口);
glViewport(0,0,宽度,高度);
}
内部主(空){
如果(!glfwInit()){
返回-1;
}
GLFWwindow*window=glfwCreateWindow(640480,“地形块渲染”,NULL,NULL);
如果(!窗口){
glfwTerminate();
返回-1;
}
glfwSetWindowSizeCallback(窗口、窗口大小回调);
而(!glfwWindowShouldClose(窗口)){
渲染(窗口);
glfwPollEvents();
}
glfwTerminate();
返回0;
}

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

您应该将
glfwSetWindowSizeCallback(window,window\u size\u回调)编码到while循环中,以便在重新调整窗口大小时调用渲染函数。很久以前我也有同样的问题


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

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

我不是很确定,但您是否检查了Windows系统设置?如果不是的话,在Windows7上,你可以按照建议去尝试,看看它是如何运行的。这意味着什么?每帧重置回调?乍一看,听起来不对。谢谢你指出这一点。看来我当时真的不明白自己在做什么。