等待 GLContext 被释放

Posted

技术标签:

【中文标题】等待 GLContext 被释放【英文标题】:Waiting for GLContext to be released 【发布时间】:2015-01-25 18:16:29 【问题描述】:

通过了一组使用 OSG 库编码并在 Window Environment 上运行的渲染库。

在我的程序中,渲染器作为成员对象存在于我的 C++ 基类中。在我的类初始化函数中,我会执行所有必要的步骤来初始化渲染器并相应地使用这个渲染器类提供的函数。

但是,我试图删除我的基类,我认为渲染器成员对象会随之被销毁。但是,当我创建该类的另一个实例时,当我尝试访问渲染器中的渲染函数时,程序会崩溃。

已就此事询问了一些意见,并被告知在 Windows 中,删除类后,渲染器将需要释放其 glContext,这可能是在 Windows 环境中等待硬件设置的不确定时间

是这样吗?如果是这样,除了修改渲染源代码(如果可以的话),我还可以采取哪些步骤来解决问题?

谢谢

【问题讨论】:

【参考方案1】:

实际上不删除/释放 OpenGL 上下文只会造成一些内存泄漏,仅此而已。离开 OpenGL 上下文不应该导致崩溃。事实上,像你这样的崩溃通常是释放某些对象的原因,这仍然是程序的其他部分所需要的,所以释放东西不应该成为像你这样的崩溃的原因。

【讨论】:

【参考方案2】:

您的问题看起来更像是搞砸的构造函数/析构函数或operator=,然后是 GL 问题。

它只是一个猜测,没有实际代码可以查看/测试 您很可能正在某处访问已删除的指针 检查类中的所有动态成员变量和指针

过去遇到过类似问题,请检查这些

trace back pointers in C++ bds 2006 C hidden memory manager conflicts (class new / delete[] vs. AnsiString) 我建议看一下第二个链接 尤其是我自己的答案,那里有很好的构造函数示例

另一个可能的原因

如果您将窗口消息代码与线程混合使用 并在线程而不是窗口代码中访问可视系统调用或对象 这可能会破坏操作系统中的某些内容并造成意外崩溃... 至少在 Windows 上

【讨论】:

以上是关于等待 GLContext 被释放的主要内容,如果未能解决你的问题,请参考以下文章

用 SDL_Renderer 绘制 2D 东西,用 SDL_GLContext 绘制 OpenGL 东西

JAVA死锁

不要被死锁吓死

不要被死锁吓死

死锁

如何解决 C++ 中的未释放锁问题