我正在处理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;
}
但是,这意味着当用户在缩放窗口而不实际移动窗口之后按住鼠标按钮时,不会调用渲染功能。有没有一种有效的方法来解决这个问题并使渲染函数更加一致地被调用?
答案 0 :(得分:3)
使用两个线程,一个用于轮询事件,另一个用于渲染。您也可能希望使用glfwWaitEvents
而不是glfwPollEvents
来阻止事件线程,直到事件可用。
答案 1 :(得分:0)
您应该将glfwSetWindowSizeCallback(window, window_size_callback);
移动到while循环中,以便在重新调整窗口大小时调用render函数。很久以前我遇到了同样的问题。
编辑:不建议在循环中设置回调。在调整窗口大小时,只需重新绘制帧。