改进窗口大小调整行为,可能通过手动设置更大的帧缓冲大小

Improving window resize behaviour, possibly by manually setting bigger framebuffer size

本文关键字:设置 缓冲 调整 窗口大小      更新时间:2023-10-16

我在Mac上开发时正在考虑在我的应用程序中使用glfw

在成功编写了一个非常简单的程序在彩色背景上渲染三角形后,我注意到在调整窗口大小时,重新渲染场景需要相当长的时间,因为我怀疑是由于帧缓冲区调整大小。

当我用NSOpenGLView重复实验时,情况并非如此。有没有办法提示glfw在启动时使用更大的帧缓冲大小,以避免昂贵的调整大小?

我正在使用GLFW 3。

您能否也帮助我为视网膜显示启用高 DPI。在文档中找不到有关此内容的内容,但在版本 3 中支持。

获取更大的帧缓冲

尝试通过调用具有较大值的glfwCreateWindow()来获取较大的初始帧缓冲区width height并立即切换到使用具有所需实际初始窗口大小的glfwSetWindowSize()显示较小的窗口。

或者,使用 glfwSetFramebufferSizeCallback() 注册自己的帧缓冲大小回调函数,并根据您的要求将帧缓冲设置为大尺寸,如下所示:

void custom_fbsize_callback(GLFWwindow* window, int width, int height)
{
    /* use system width,height */
    /* glViewport(0, 0, width, height); */
    /* use custom width,height */
    glViewport(0, 0, <CUSTOM_WIDTH>, <CUSTOM_HEIGHT>);
}

更新
在窗口重新调整大小(和窗口拖动(操作期间看到的渲染管线停滞是由于窗口管理器中实现的阻塞行为造成的。

为了在应用程序中缓解这种情况,需要为窗口消息安装处理程序函数,并在独立于主应用程序(GUI(线程的单独线程中运行渲染管线。


高 DPI 支持

GLFW文档说:

GLFW现在支持Windows和OS X上的高DPI显示器,从而提供 窗口全分辨率帧缓冲区,其中其他 UI 元素位于 放大了。 为了实现这一点,glfwGetFramebufferSize((glfwSetFramebufferSizeCallback(( 已被添加。 这些适用于 像素,而 GLFW API 的其余部分使用屏幕坐标。

AFAIK,这似乎是文档中有关高DPI的几乎所有内容。

通过代码,我们可以看到,在Windows上,glfw钩接到SetProcessDPIAware()并在platformInit期间调用它。目前,我无法在Mac上找到任何类似的高DPI支持代码。