【发布时间】:2013-12-21 22:39:49
【问题描述】:
有趣的是,到目前为止,我从未丢失过 Opengl 上下文(所有缓冲区资源都被擦除)。我目前在 Win7 64 上通过 SDL 1.2 和 GLEW 使用 OpenGL 4.2,而且我的应用程序是窗口化的,无法在运行时切换到全屏(仅在启动时允许)。
在我的开发机器上下文似乎永远不会在重新调整大小时丢失,但在其他机器上我的应用程序可能会丢失 OpenGL 上下文(这似乎很少见)。由于内存限制(我有很多内存被应用程序的其他部分使用)我没有在系统内存中备份我的 gl 缓冲区内容(VBO、FBO、纹理等),奇怪的是这不是问题我过去,因为上下文从未被擦除。
除了可能在全屏和窗口之间切换之外,在什么情况下 OpenGL 上下文会丢失(所有 GPU 内存缓冲区都被擦除),很难从谷歌搜索中辨别出来。
回到我的 DX 时代,上下文丢失可能有多种原因,当它发生时我会收到通知并从系统内存备份中重新加载我的缓冲区。我假设(我的假设可能是错误的)OpenGL(或像 SDL 这样的管理库)会为我处理这个缓冲区重新加载。这在某种程度上是正确的吗?
我遇到的一个问题是在调整大小时丢失上下文,非常不方便,我正在使用大量 GPU 内存,并且必须重新加载所有内容可能会暂停应用程序一段时间(比我想要的要长得多)。
这是依赖于设备还是依赖于驱动程序?它是设备、驱动程序和 SDL 版本的某种组合吗?如何检测到这样的上下文丢失,以便我对其做出反应?
保留所有 gl 缓冲区内容的系统内存内容是否是标准做法,以便在上下文丢失时重新加载它们?或者上下文丢失是否足够罕见以至于它不是标准做法?
【问题讨论】:
-
我们需要在某个时候查看丢失 OpenGL 上下文的程序代码。