OpenGL上下文丢失

7
有趣的是,我之前从未遇到过OpenGL上下文丢失(即所有缓冲区资源被擦除)的情况,但现在遇到了。我目前使用的是OpenGL 4.2,通过SDL 1.2和GLEW在Win7 64上运行,我的应用程序是窗口化的,无法在运行时切换到全屏模式(只能在启动时允许)。
在我的开发机上,重新调整大小似乎不会导致上下文丢失,但在其他机器上,我的应用程序可能会失去OpenGL上下文(这似乎很少见)。由于内存限制(我的应用程序中有很多内存被其他部分使用),我没有在系统内存中备份我的gl缓冲区内容(VBO、FBO、纹理等),奇怪的是,这在过去对我来说并不是问题,因为上下文从未被擦除过。
从谷歌搜索中很难确定OpenGL上下文何时会丢失(即所有GPU内存缓冲区都被擦除),除了可能在全屏和窗口模式之间切换。
回想起我DX时代,上下文丢失可能发生的原因很多,当它发生时,我会得到通知,并从系统内存备份中重新加载我的缓冲区。我曾经认为(也许是我错误地认为),OpenGL(或像SDL这样的管理库)会为我处理这个缓冲区重新加载。这在任何程度上甚至部分正确吗?
我遇到的问题之一是,在调整大小时丢失上下文非常不方便,我使用了大量的GPU内存,重新加载所有内容可能会暂停应用程序一段时间(比我想要的时间长)。
这是一个设备相关的问题还是驱动程序相关的问题?它是设备、驱动程序和SDL版本的组合吗?如何检测到这种上下文丢失,以便我可以对其做出反应?
保留所有gl缓冲区内容的系统内存副本以便在上下文丢失时重新加载,这是标准做法吗?还是上下文丢失太少见,不是标准做法?

1
我们需要查看一个程序的代码,该程序在某个时刻丢失了OpenGL上下文。 - vallentin
2个回答

5
OpenGL中的上下文重置(丢失)通常是在幕后完全透明地处理的。实际上,没有人会在应用程序内存中保留GL资源以处理丢失的上下文,因为除非您正在使用OpenGL的非常新的扩展(强大的上下文),否则无法知道何时发生OpenGL上下文重置以处理丢失的状态。驱动程序通常会为您完成所有这些操作,但是您可以像2.6 -“图形重置恢复”中所述那样接收通知并定义与上下文重置相关的行为。
但请注意,OpenGL中的上下文丢失与D3D中的上下文丢失非常不同。在GL中,上下文丢失是因为发生了一些灾难性错误(例如,着色器运行时间过长或内存访问冲突),并且在像WebGL这样具有比常规GL更严格的安全/可靠性约束的东西中最有用。在D3D中,您可以通过Alt + Tabbing或从窗口模式切换到全屏模式而失去上下文。无论如何,我认为这是一个SDL问题,与GL的上下文重置概念毫不相关。

3
实际上这是一个SDL-1.2的问题。SDL-1.2在调整窗口大小方面表现不佳,有些代码路径实际上需要进行完全重新初始化。因此,你不应该将其用于OpenGL,而应该使用已经解决了这些问题的SDL-2。 - datenwolf

4
您正在使用SDL-1.2。在SDL-1.2中,当窗口调整大小时,OpenGL上下文可能会被重新创建(即正确关闭和重新初始化)。这是SDL的已知限制,在SDL-2中得到了解决。
因此,要么使用SDL-2,要么使用专门针对OpenGL进行了优化的不同框架,如GLFW。
“上下文丢失”对于OpenGL上下文来说并不是标准做法。在某些情况下,SDL-1.2会将它们释放。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接