Opengl上下文丢失

Opengl上下文丢失,opengl,sdl,Opengl,Sdl,有趣的是,到目前为止,我从未丢失过Opengl上下文(所有缓冲区资源都被擦除)。我目前正在使用OpenGL 4.2,通过Win7 64上的SDL 1.2和GLEW,我的应用程序也被窗口化,无法在运行时切换到全屏(仅在启动时允许) 在我的dev机器上,上下文似乎永远不会在重新调整大小时丢失,但在其他机器上,我的应用程序可能会丢失OpenGL上下文(这似乎很少见)。由于内存限制(应用程序的其他部分使用了大量内存),我没有在系统内存中备份gl缓冲区内容(VBO、FBO、纹理等),奇怪的是,这在过去对我

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

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

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

在我的DX时代,由于很多原因,上下文丢失可能会发生,发生时会通知我,并从系统内存备份中重新加载缓冲区。我假设OpenGL(或者像SDL这样的管理库)会为我处理这个缓冲区重新加载(这个假设可能是错误的)。这在任何方面都是部分正确的吗

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

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


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

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

所以要么使用SDL-2,要么使用专门为OpenGL定制的不同框架,比如GLFW

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

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

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


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

我们需要在某个时候查看OpenGL上下文丢失的程序代码。事实上,这是一个SDL-1.2问题。SDL-1.2不能很好地处理大小调整,一些代码路径实际上执行完全重新初始化。因此,您不应该在OpenGL中使用它,而应该在SDL-2中使用它,因为SDL-2已经清除了这些内容。