【问题标题】:Is it possible to toggle fullscreen without recreating the window?是否可以在不重新创建窗口的情况下切换全屏?
【发布时间】:2014-09-02 20:13:19
【问题描述】:

Linux、Windows 和 Mac 三大操作系统是否支持在不重新创建窗口的情况下在全屏和窗口模式之间切换?重新创建是有问题的,因为它意味着要重新创建 OpenGL 上下文,或者至少是一些 OpenGL 对象。

这些平台上有哪些 API 函数可用于执行任务?

【问题讨论】:

  • 我使用SDL2 来执行此操作。 SDL1 全屏工作有点像噩梦。虽然没有使用 mac 的经验。

标签: opengl window cross-platform


【解决方案1】:

Windows:是的

X11/GLX:是的

MacOS-X:很复杂。


首先是简单的东西:在 Windows 和 X11 中,没有像 特殊的全屏模式 OpenGL 窗口这样的东西。它们都是普通的顶层窗口,您可以随时添加或删除窗口装饰(标题栏、边框)。如果您删除窗口装饰并将窗口大小设置为最大化,您基本上会得到一个全屏 OpenGL 窗口;事实上,图形驱动程序足够聪明,可以检测到这种情况并切换到快速通道。


现在是 MacOS X。在 MacOS X 中,WindowedFullscreen 之间有明显的区别(恕我直言,这很烦人)。

好消息是,您可以访问允许实现一些资源共享的底层上下文对象,这样您就不必重新创建包含 OpenGL 对象的数据。

Big Fat 免责声明:我从来没有像在其他操作系统上那样深入研究过 MacOS X,所以我在 MacOS X 上对这个特定主题的实践经验只是理论上的。

【讨论】:

  • 在 Windows 上,当将一个屏幕上的窗口切换到全屏模式时,我的三个显示器都黑了一秒钟。所以在我看来,状态也发生了变化。你怎么看?
  • @danijar 我倾向于同意,尽管我对细节知之甚少。全屏 3D 应用程序和窗口模式之间的窗口存在巨大的功能(有时是性能)差异。我通常在窗口模式下运行游戏并手动移除它们的装饰,这样 alt-tab 和其他 3D 应用程序或 vlc 之类的东西就不会中断。
  • @danijar:您观察到的模式变化完全独立于切换到全屏。发生的情况是,(在 Windows 中)程序调用函数 SetDisplaySettings 将显示切换到所需的分辨率和频率然后创建一个填充屏幕的窗口。在 X11/GLX 中,通过 XRandR 扩展与基于 Xlib 的 XRR 函数 XRRSetScreenConfigAndRate 有类似的功能。
  • @danijar:虽然切换旧游戏的整个模式是不合时宜的。这样做是为了限制 GPU 必须渲染的分辨率,即以性能换取图像质量。如今,这样做的首选方法是渲染到所需分辨率的帧缓冲区对象 (FBO) 中,然后作为后处理步骤将其绘制到原生大小的全屏窗口。这样做的好处是,它不会影响用户的个人系统配置。例如,在较旧的 Windows 版本中,更改显示模式通常会打乱桌面图标的排列。
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 2021-04-07
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多