【问题标题】:Opengl Context LossOpengl 上下文丢失
【发布时间】:2013-12-21 22:39:49
【问题描述】:

有趣的是,到目前为止,我从未丢失过 Opengl 上下文(所有缓冲区资源都被擦除)。我目前在 Win7 64 上通过 SDL 1.2 和 GLEW 使用 OpenGL 4.2,而且我的应用程序是窗口化的,无法在运行时切换到全屏(仅在启动时允许)。

在我的开发机器上下文似乎永远不会在重新调整大小时丢失,但在其他机器上我的应用程序可能会丢失 OpenGL 上下文(这似乎很少见)。由于内存限制(我有很多内存被应用程序的其他部分使用)我没有在系统内存中备份我的 gl 缓冲区内容(VBO、FBO、纹理等),奇怪的是这不是问题我过去,因为上下文从未被擦除。

除了可能在全屏和窗口之间切换之外,在什么情况下 OpenGL 上下文会丢失(所有 GPU 内存缓冲区都被擦除),很难从谷歌搜索中辨别出来。

回到我的 DX 时代,上下文丢失可能有多种原因,当它发生时我会收到通知并从系统内存备份中重新加载我的缓冲区。我假设(我的假设可能是错误的)OpenGL(或像 SDL 这样的管理库)会为我处理这个缓冲区重新加载。这在某种程度上是正确的吗?

我遇到的一个问题是在调整大小时丢失上下文,非常不方便,我正在使用大量 GPU 内存,并且必须重新加载所有内容可能会暂停应用程序一段时间(比我想要的要长得多)。

这是依赖于设备还是依赖于驱动程序?它是设备、驱动程序和 SDL 版本的某种组合吗?如何检测到这样的上下文丢失,以便我对其做出反应?

保留所有 gl 缓冲区内容的系统内存内容是否是标准做法,以便在上下文丢失时重新加载它们?或者上下文丢失是否足够罕见以至于它不是标准做法?

【问题讨论】:

  • 我们需要在某个时候查看丢失 OpenGL 上下文的程序代码。

标签: opengl sdl


【解决方案1】:

OpenGL 中的上下文重置(丢失)通常在幕后完全透明地处理。从字面上看,没有人将 GL 资源保留在应用程序内存中以处理丢失的上下文,因为除非您使用 OpenGL 的一个非常新的扩展(健壮上下文),否则无法知道 OpenGL 中何时发生上下文重置以处理丢失状态。驱动程序通常会为您完成所有这些工作,但您可以接收通知并定义与上下文重置相关的行为,如标题 2.6 - "Graphics Reset Recovery" 中所述。

但请注意,OpenGL 中的丢失上下文与 D3D 中的丢失上下文非常不同。在 GL 中,由于发生了一些灾难性错误(例如着色器耗时过长或内存访问冲突)而发生丢失上下文,并且在 WebGL 之类的东西中最有用,它比常规 GL 具有更严格的安全/可靠性约束。在 D3D 中,您可以简单地通过 Alt + Tabbing 或从窗口模式切换到全屏模式来丢失上下文。无论如何,我认为这是一个 SDL 问题,与 GL 的上下文重置概念无关。

【讨论】:

  • 这实际上是一个 SDL-1.2 问题。 SDL-1.2 不能很好地处理大小调整,并且一些代码路径实际上会执行完全重新初始化。因此,您不应将其用于 OpenGL,而应将其用于已清除这些问题的 SDL-2。
【解决方案2】:

您使用的是 SDL-1.2。使用 SDL-1.2,当窗口调整大小时,完全有可能重新创建 OpenGL 上下文(即正确关闭和重新初始化)。这是 SDL 的一个已知限制,已在 SDL-2 中解决。

因此,要么使用 SDL-2,要么使用专门为 OpenGL 量身定制的不同框架,例如 GLFW。

或者上下文丢失是否足够罕见以至于它不是标准做法?

OpenGL 上下文不会“丢失”。它们被解除分配,这就是 SDL-1.2 在某些条件下所做的事情。

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2015-06-24
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多