2013-12-21 66 views
5

所以有趣的是我从未有过的OpenGL上下文丢失(其中所有的缓冲资源被全歼)直到现在。我目前正在使用OpenGL 4.2,通过SDL 1.2和Win7 64上的GLEW,同时我的应用程序也被打开,无法在运行时切换到全屏(仅在启动时允许)。OpenGL上下文损失

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

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

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

我遇到的一个问题是,在调整大小时丢失上下文很不方便,我使用ALOT GPU内存,并且不得不重新加载所有内容,可能会暂停应用程序(但时间长于我的愿望) 。

这是一个与设备相关的事物或驱动程序依赖?它是设备,驱动程序和SDL版本的组合吗?如何检测到这种情况下的损失,以便我可以对此做出反应?

标准做法是保持所有gl缓冲区内容的系统内存内容,以便它们可以在上下文丢失时重新加载?或者是一种罕见的情况下损失,这是不标准的做法?

+1

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

回答

3

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

因此,无论使用SDL-2或使用一个已经对OpenGL量身定制,就像GLFW不同的框架。

或者是一种罕见的情况下损失,它不是标准的做法?

OpenGL上下文不会“丢失”。它们被释放,这就是SDL-1.2在某些情况下所做的。在OpenGL

3

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

但要知道,在OpenGL中丢失的情况下是在D3D丢失的情况下非常不同。在GL中,丢失的上下文是因为发生了一些灾难性错误(例如,着色器需要太长的时间或内存访问冲突),并且在像WebGL这样的东西中最有用,它比普通的GL有更严格的安全/可靠性限制。在D3D中,只需通过Alt + Tab键或从窗口模式切换到全屏模式即可丢失上下文。无论如何,我认为这是一个SDL问题,与GL的上下文重置概念根本没有关系。

+2

这实际上是一个SDL-1.2问题。 SDL-1.2无法很好地处理调整大小,并且一些代码路径实际上会执行完全重新初始化。因此,你不应该将它用于OpenGL,而是SDL-2,它已经清除了这些东西。 – datenwolf