【发布时间】:2016-10-09 21:50:05
【问题描述】:
我有一个通过 JOGL 使用 OpenGL 的 Java 程序,并且有一些只出现在我想调试的 Windows 上的错误。为此,我尝试用Windows设置备用计算机,但在调试程序时遇到了一个奇怪的问题:
当我通过 Java Web Start“正常”运行程序时,它可以正常运行,但是当我编译程序并尝试通过命令行 java 启动器或通过 NetBeans 运行它时(我认为确实如此)同样的东西),它似乎使用了一种不同的非常原始的 OpenGL 实现,它不支持可编程着色或任何东西。
在研究问题时,我让自己明白,在 Windows 上运行的 OpenGL 程序会加载 opengl32.dll,这显然是 Windows 附带的一个通用库(如果我错了,请纠正我)并反过来加载“真正的”OpenGL 实现并将 OpenGL 函数调用转发给它。 (这似乎也有点用词不当,因为它实际上是在一个明显高于 232 的基地址处加载到一个 64 位进程中的。)
使用 Process Explorer,我看到,当我在 Java Web Start(它工作的地方)下运行程序时,它会加载库 ig4icd64.dll,我假设它是英特尔 GPU 驱动程序的实际 OpenGL 实现库;而当尝试通过java.exe 运行程序时,会加载opengl32.dll,但从未加载过ig4icd64.dll,这似乎证实了我对它使用不同的OpenGL 实现的怀疑。
所以这就引出了主要问题:opengl32.dll 如何选择要使用的 OpenGL 实现,我如何影响这个选择以确保加载正确的实现?有什么方法可以调试这个? (这两个上下文之间有什么不同导致它选择不同的实现?在这两种情况下,都使用了 64 位 Java,因此应该不会混淆 32 位或 64 位实现。)
更新:我在 Microsoft 的网站上找到了 this page,它声称 OpenGL ICD 是通过 HKLM/System/CurrentControlSet/Control/Class/{Adapter GUID}/0000/ 注册表项中的 OpenGLDriverName 值找到的。该值确实正确包含ig4icd64.dll,然而,也许更奇怪的是,使用进程监视器来监视Java 进程的系统调用(如果这是正确的Windows 术语)表明它从未尝试访问该密钥。我不能说我知道这是否意味着这篇文章不正确,或者我是否错误地使用了进程监视器,或者是否是其他原因。
【问题讨论】: