我有几个“插件” - DLL,它们都有一个GUI,现在基于OpenGL。一切正常,但当我打开其中许多时,会出现问题(下图)......它出现在我的主要开发机器上,相当陈旧但仍然合理的ATI Radeon HD 4600(带有最新的驱动程序,仍然标记为遗留),但不是在没有集成Intel HD和NVidia的笔记本电脑的现代笔记本电脑上。
有两件事情可能发生,似乎是随机的:
A)wglCreateContext返回NULL,但GetLastError表示一切正常!在这种情况下,我有使用CPU进行仿真的备份计划。慢,但有效...
...不幸
B)“aticfx64.dll”因访问冲突读取0xffffffffffffffff而崩溃。显然它是ATI的驱动程序,但无论哪种方式都无法摆脱这种......
有什么想法吗?我的意思是打开这么多窗户并不是很典型,但它应该能够处理它,对吗?我主要担心的是,是否有一些限制或方法来解决这个问题。我只是有点害怕这可能会发生在说2个窗口......这只会是坏事。
答案 0 :(得分:0)
我建议检查内存使用情况。如果仅在打开的多个窗口上发生,则可能会暴露驱动程序错误,而不会检查分配是否成功(当内存碎片或内存有限时,分配可能会失败)。当wglCreateContext返回NULL时,尝试分配更大的内存块 - 如果失败则可能就是这种情况。
另一个问题可能是使用比驱动程序允许的更多共享上下文。理论上,规范(http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt)说“任意数量的上下文可以这种方式共享数据”。但是使用任意大量的共享上下文是一个尘封的规范角落,可能没有经过充分测试。如果您使用超过32个共享上下文,则可能就是这种情况(共享上下文可以作为位掩码存储在DWORD内部)。您可以通过尝试创建33个共享上下文并检查它们中的任何一个是否返回NULL来轻松地检查这一点。
答案 1 :(得分:0)
当你不再使用HGLRC时,不要忘记调用wglDeleteContext,否则你会有内存泄漏,最后是访问冲突(至少在ati上)。
(在我发现问题之前,我遇到了这个奇怪的错误)