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 视频适配器的机器上没有任何崩溃。在其他带有英特尔显卡的机器上,有时会在调试阶段出现崩溃。

我开始假设这是由于不正确的 ant 设置而发生的(在 startup.ini 中设置了以下路径:-Djava.library.path=lib/dlls,因此可以看到项目的 dlls)。但仍然无法理解为什么它在 AMD 上几乎可以完美运行而在 Intel 上崩溃。

也许它与蚂蚁有关,我必须将dll添加到manfest ...查看文档并找不到如何完成它。

解决方案:

在 64 位系统上必须使用相应的 JVM(64 位),然后没有崩溃 =))

4

2 回答 2

2

发生崩溃是因为在 64 位操作系统上使用了 32 位 JVM。在这种情况下,似乎加载了 32 位 dll,这就是发生崩溃的原因。

问题只能在英特尔显卡上重现,我认为它可以被认为是一个严重的错误。如果英特尔想要修复它或提出一个可行的解决方案/解决方法,这可能很棒!=)

于 2012-01-15T07:16:20.980 回答
1

避免在 Swing Event Dispatch 线程中做 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 实现假定您需要多个视口,但情况并非如此。如果可以的话,您可以将其重新编码为仅支持一个视口,并且您不应该因为代码更简单而崩溃。

于 2012-01-10T12:49:12.687 回答