Opengl上下文丢失

时间:2013-12-21 22:39:49

标签: opengl sdl

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

  

或者上下文丢失是否足够罕见而不是标准做法?

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