JMonkeyEngine在英特尔显卡上崩溃

5

我正在使用JME框架开发应用程序,有时会遇到以下错误信息导致程序崩溃:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x3d601ad7, pid=168, tid=4012
#
# JRE version: 6.0_29-b11
# Java VM: Java HotSpot(TM) Client VM (20.4-b02 mixed mode, sharing windows-x86)
# Problematic frame:
# C  [ig4dev32.dll+0x21ad7]
#
# An error report file with more information is saved as:
# C:\...\hs_err_pid168.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

日志文件可以通过此链接找到:http://sergpank.heliohost.org/log.html

最奇怪的是,我在编译后的代码中才会出现崩溃,但当我从Eclipse启动它时,我的机器上一切正常。在搭载AMD视频适配器的机器上没有崩溃。在其他安装了Intel显卡的机器上有时候也会出现崩溃,这通常是在调试阶段。

我开始怀疑这是因为ant设置不正确(在startup.ini中设置了以下路径:-Djava.library.path=lib/dlls,所以dlls可以被该项目看到)。但仍然想不通为什么它在AMD上几乎完美运行,在Intel上却会崩溃。

也许这与ant有关,我必须将dlls添加到manifest文件中...查看文档,但找不到如何实现它的方法。

解决方案:

在64位系统上必须使用对应的JVM(64位),然后就不会崩溃 =))


考虑到您在其他硬件上没有遇到崩溃的情况,问题几乎肯定与驱动程序有关,这意味着答案的要点归结为不太有用但准确的“是的,那就是英特尔驱动程序”。请确保您的驱动程序已经更新,并再次尝试。如果您发布生成的hs_err_pid168.log文件的堆栈跟踪部分(打开它,它只是一个文本文件),这可能至少有助于确定导致崩溃的调用。 - Chuck Adams
日志文件看起来像这样:http://sergpank.heliohost.org/log.html希望它能说明问题 =) - sergpank
2个回答

2

由于在64位操作系统上使用了32位JVM,导致了程序崩溃。看起来在这种情况下,加载了32位dll文件,这就是程序崩溃的原因。

该问题只在英特尔显卡上复现,我认为这可以被视为一个严重的错误。如果英特尔能够解决它或提出可行的解决方案/变通方法,那将非常好!=)


1

避免在Swing事件分派线程中执行OpenGL相关的繁重工作(请注意导致JVM崩溃的线程:=>0x3a88e000 JavaThread "AWT-EventQueue-0" [_thread_in_native, id=5228, stack(0x3b170000,0x3b1c0000))。我认为OpenGL相关的工作应该在JMonkeyEngine提供的线程中使用其事件分派机制完成。如果您正在使用别人的API进行Swing渲染,您可能需要更改它或以不同的方式执行。

编辑:看起来AWTGLCanvas可以做到这一点,将上下文切换到当前线程。看起来英特尔驱动程序可能会在正常全屏3D工作时出现上下文切换问题。严格来说,GL线程上下文相关的东西是不必要的,因为您始终可以将要执行的工作调度到一个OpenGL线程中,只要您只有一个OpenGL渲染视口,这应该是可以的。LWJGL Canvas实现假定您希望拥有多个视口,但这并不一定是情况。如果可以接受,您可以重新编码以仅支持一个视口,并且由于代码更简单,因此不应该出现崩溃。


@sergpank,无论您的代码是使用32位还是64位JDK编译的,都没有关系;Java字节码与平台的“位数”无关。没有32位或64位的Java字节码。 - Jesper
@Jesper,也许问题在于我使用的是Windows 7 64位系统。Java部分运行得非常完美,但当我开始处理本地库时,如果项目在32位JRE上运行,就会出现崩溃。 - sergpank
1
据我所知,如果您使用32位本地库,则需要32位JRE;如果您使用64位本地库,则需要64位JRE。原则上,32位库也应该在64位系统上工作,但是您使用的库可能存在特定问题。 - Jesper
@Jesper,这就是我们也决定的。如果win ix是64位,则jmonkey仅在JRE为64位时不会崩溃,如果JRE为32位,则使用32位dll并崩溃。最奇怪的是,为什么这个问题只出现在英特尔适配器上...感谢您的帮助,我认为这个问题可以被视为已解决。 - sergpank
1
如果只有Intel显卡出现问题,而其他品牌没有此类问题,那么可能是Intel显卡驱动程序的一个错误。@sergpank - Jesper
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接