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

tza*_*dor 13 c c++ opengl glfw

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

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

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

我正在使用GLFW 3.

你能帮助我为视网膜显示启用高DPI吗?无法在文档中找到某些内容,但在版本3中支持.

The*_*ist 9

获得更大的帧缓冲区

尝试通过调用&的glfwCreateWindow()大值来获得大的初始帧缓冲区,并立即切换到使用所需的实际初始窗口大小显示较小的窗口.widthheightglfwSetWindowSize()

或者,使用注册自己的帧缓冲区大小回调函数, 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>);
}
Run Code Online (Sandbox Code Playgroud)

更新:在窗口重新调整大小(和窗口拖动)操作期间看到
渲染管道停顿是由于窗口管理器中实现的阻塞行为.

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


高DPI支持

GLFW文件说:

GLFW现在支持Windows和OS X上的高DPI监视器,提供窗口全分辨率帧缓冲区,其他UI元素按比例放大.为此,添加了glfwGetFramebufferSize()glfwSetFramebufferSizeCallback().这些使用像素,而GLFW API的其余部分使用屏幕坐标.

AFAIK,在文档中似乎几乎所有关于高DPI的内容.

通过代码去,我们可以看到,在Windows上,GLFW挂接到SetProcessDPIAware()platformInit过程中调用它.目前我无法在mac上找到任何类似的高DPI支持代码.