Opengl上下文丢失

Rya*_*yan 6 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缓冲区内容的系统内存内容,以便它们可以在上下文丢失时重新加载吗?或者是背景损失是否足够罕见以至于它不是标准做法?

And*_*man 5

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

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

  • 实际上,这是一个SDL-1.2问题。SDL-1.2不能很好地调整大小,某些代码路径实际上执行了完全重新初始化。因此,您不应将其用于OpenGL,而应将SDL-2用于OpenGL。 (3认同)

dat*_*olf 4

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

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

或者上下文丢失是否非常罕见,以至于不是标准做法?

OpenGL 上下文并没有“丢失”。它们被释放,这就是 SDL-1.2 在某些条件下所做的事情。