1

我有几个“插件”——DLL,它们都有一个 GUI,现在基于 OpenGL。一切正常,但是当我打开其中许多时,会出现问题(如下)......它发生在我的主要开发机器上,使用相当旧但仍然合理的 ATI Radeon HD 4600(使用最新的驱动程序,但仍然标记为旧版),但不是在一台既没有集成 Intel HD 也没有 NVidia 的非常现代的笔记本电脑上。

可能会发生两件事,似乎是随机的:

A) wglCreateContext 返回 NULL,但 GetLastError 表示一切正常!在这种情况下,我有使用 CPU 进行仿真的备份计划。慢,但工作...

很遗憾...

B)“aticfx64.dll”崩溃,访问冲突读取 0xffffffffffffffff。显然它是 ATI 驱动程序,但无论哪种方式都无法摆脱这种情况......

有任何想法吗?我的意思是打开这么多窗口并不完全正常,但它仍然应该能够处理它,对吧?我主要担心的是是否有一些限制或方法来处理这个问题。我只是有点担心这可能会发生在说 2 个窗口中……那会很糟糕。

4

2 回答 2

0

我建议检查内存使用情况。如果它只发生在打开的多个窗口上,您可能会暴露一个驱动程序错误,它不会检查分配是否成功(当您的内存碎片或内存有限时,分配可能会失败)。当 wglCreateContext 返回 NULL 时,尝试分配更大的内存块 - 如果失败,可能就是这种情况。

另一个问题可能是使用了比驱动程序允许的更多的共享上下文。理论上规范(http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt)说“任意数量的上下文可以以这种方式共享数据。” 但是使用任意数量的共享上下文是规范的一个尘土飞扬的角落,可能没有经过很好的测试。如果您使用超过 32 个共享上下文(共享上下文可以作为位掩码在 DWORD 内部存储),则可能会出现这种情况。您可以通过尝试创建 33 个共享上下文并检查其中任何一个是否返回 NULL 来轻松检查这一点。

于 2013-12-03T09:08:24.437 回答
0

当您不再使用 HGLRC 时,不要忘记调用 wglDeleteContext,否则您将有内存泄漏,最后,访问冲突(至少在 ati 上)。
(在我发现问题之前,我遇到了这个奇怪的错误)

于 2015-03-11T10:22:23.650 回答