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

标签 c++ c opengl glfw

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

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

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

我正在使用 GLFW 3。

您能否帮助我为 Retina 显示器启用高 DPI。在文档中找不到相关内容,但在版本 3 中支持。

最佳答案

获取更大的帧缓冲区

通过调用 glfwCreateWindow() 尝试获取一个大的初始帧缓冲区 具有较大的 widthheight 值并立即切换到使用 显示较小的窗口> 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>);
}

更新:
render pipeline stall seen during the window re-size(and window drag) operation是由于在窗口管理器中实现的阻塞行为。

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


高 DPI 支持

GLFW 文档说:

GLFW now supports high-DPI monitors on both Windows and OS X, giving windows full resolution framebuffers where other UI elements are scaled up. To achieve this, glfwGetFramebufferSize() and glfwSetFramebufferSizeCallback() have been added. These work with pixels, while the rest of the GLFW API work with screen coordinates.

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

通过代码我们可以看到在 Windows 上,glfw hooks into SetProcessDPIAware()calls it during platformInit .目前我在 mac 上找不到任何类似的高 DPI 支持代码。

关于c++ - 改进窗口调整大小行为,可能通过手动设置更大的帧缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512006/

相关文章:

c++ - double 存储什么?

c++ - Arduino 锁定

c - tasklet_action()函数中为什么会调用BUG?

c - 具有两个可执行文件的递归生成文件

c - 这个程序有什么问题?

c++ - clang 中 regex_constants 的错误实现?

C++ OpenGL 如何从四元数获取旋转 x,y,z

opengl - GLSL 全局变量

c++ - glm glx 旋转不起作用

c++ - 统一位置和属性位置——是同一个数列吗?