【问题标题】:Improving window resize behaviour, possibly by manually setting bigger framebuffer size改善窗口大小调整行为,可能通过手动设置更大的帧缓冲区大小
【发布时间】:2013-07-04 22:07:18
【问题描述】:

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

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

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

我正在使用 GLFW 3。

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

【问题讨论】:

  • GL默认的framebuffer是“window-system提供的framebuffer”,完全不受GL的控制,由窗口系统/操作系统管理。所以如果有办法改变它,你必须为你的操作系统/窗口系统寻找平台特定的功能。我不知道任何平台上的任何此类功能,但我没有寻找这样的东西。
  • 我尝试用原生 Cocoa api 做同样的事情,并且调整大小非常顺利。所以可能会对 glfw 进行改进
  • 据我所知,使用 GLFW 的全部目的是在窗口管理和 OpenGL 内容创建方面获得帮助。因此,我认为更改调整大小方法并不容易。您可能需要进行非常底层的编码。
  • 是否需要一些时间来重新渲染场景,即使您将大小调整为较小的窗口如果您这样做会发生这种情况吗?重新调整到比原来更大的窗口大小?
  • 总是,它似乎没有进行任何重新渲染,直到您在调整窗口大小时松开鼠标。

标签: c++ c opengl glfw


【解决方案1】:

获取更大的帧缓冲区

尝试通过调用 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 现在支持 Windows 和 OS X 上的高 DPI 显示器,提供 其他 UI 元素所在的 Windows 全分辨率帧缓冲区 放大。为此,glfwGetFramebufferSize()glfwSetFramebufferSizeCallback() 已添加。这些与 像素,而 GLFW API 的其余部分使用屏幕坐标。

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

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

【讨论】:

  • 在创建窗口之前如何调用glfwSetFramebufferSizeCallback。如果我没记错的话,这个函数必须传递给应该设置回调的窗口。
  • @bgamari 很好。修正了答案中的错误。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2012-12-02
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多