我有几个“插件”-DLL,它们都有一个图形用户界面,现在基于OpenGL。这一切都很好,但当我打开它们中的许多时,出现了一个问题(如下所示)……它发生在我的主要开发机器上,使用的是相当旧但仍然合理的ATI Radeon HD 4600 (带有最新的驱动程序,虽然仍然是传统的),但不是在既没有集成英特尔HD也没有NVidia的笔记本电脑上。
有两件事可能会发生,看起来是随机的:
A) wglCreateContext返回NULL,但是GetLastError说一切正常!在这种情况下,我有使用CPU进行仿真的备份计划。很慢,但很管用...
不幸的是。
B) "aticfx64.dll“崩溃,访问冲突读取0xffffffffffffffffff。很明显是ATI司机干的,但不管怎样都逃不掉...
有什么想法吗?我的意思是,这不是典型的有这么多窗口打开,但它仍然应该能够处理它,对吗?我主要关心的是是否有一些限制或方法来处理这个问题。我只是有点担心这可能会发生在两个窗口...那就太糟糕了。
发布于 2013-12-03 17:08:24
我建议检查内存使用情况。如果它只发生在多个打开的窗口上,你可能会暴露出一个驱动程序错误,它不检查分配是否成功(当你的内存碎片或内存有限时,分配可能会失败)。当wglCreateContext返回NULL时,尝试分配更大的内存块-如果失败,可能会出现这种情况。
另一个问题可能是使用了比驱动程序允许的更多的共享上下文。从理论上讲,spec (http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt)说“任意数量的上下文都可以以这种方式共享数据。”但使用任意数量的共享上下文是规范的一个尘封的角落,可能没有得到很好的测试。如果您使用32个以上的共享上下文(共享上下文可以作为位掩码存储在DWORD内部),则可能会出现这种情况。您可以通过尝试创建33个共享上下文并检查其中是否有任何一个返回NULL来很容易地检查这一点。
发布于 2015-03-11 18:22:24
当你不再使用HGLRC时,不要忘记调用wglDeleteContext,否则你会有内存泄漏,最终会出现访问冲突(至少在ati上)。
(我有一个奇怪的错误,直到我发现了问题)
https://stackoverflow.com/questions/20220461
复制相似问题