有时在我的OpenGL应用程序中,我在以下API调用中遇到访问冲突:
wglMakeCurrent(NULL, NULL);
应用程序只有一个单独的线程,我在检查之前检查过,当前使用的DC和HGLRC都是正确且有效的。
OpenGL内容有三个不同的窗口,它们都在WM_PAINT消息上重新绘制,如果由于用户交互需要刷新(例如,选择一个对象)。
此访问冲突也发生在具有不同图形卡的不同计算机上,因此我认为这不是驱动程序问题。
什么可能导致此API调用崩溃?我应该在应用程序代码中调查一下,找出这种情况发生的原因/原因?我真的迷失了,因为我已经检查了我能想到的一切。我希望有人可以提供更多要检查的提示/想法。
答案 0 :(得分:2)
此调用的目的是释放当前线程的设备上下文吗?这是两个参数传递NULL的唯一时间是有效的。来自文档:
“如果hglrc为NULL,则该函数使调用线程的当前呈现上下文不再是当前的,并释放呈现上下文使用的设备上下文。在这种情况下,将忽略hdc。”
除了Tarydon关于添加glFlush
的建议之外,这似乎是多余的:
“在切换到新的渲染上下文之前,OpenGL会刷新当前到调用线程的任何先前渲染上下文。”
鉴于API实际崩溃,并且不会简单地导致失败,我能想到的唯一建议是,您调用wglMakeCurrent
来释放HGLRC
的线程不是用于将HGLRC
与该设备上下文相关联的相同线程上下文。因此,驱动程序可能正在为调用查找错误的线程本地存储,从而导致崩溃。
如果您在代码中添加一些日志记录并在每次调用wglMakeCurrent
之前打印当前的线程ID,会发生什么?
请参阅:
wglMakeCurrent reference
答案 1 :(得分:1)
原来,更新的图形驱动程序解决了这个问题。所以这是驱动程序中的问题。
答案 2 :(得分:0)
尝试在执行此操作之前添加glFlush调用。也许渲染管道尚未完全刷新到GPU。