我在我的应用程序中使用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,因此可以看到项目的dll)。但仍然无法理解为什么它几乎完全适用于AMD和英特尔的崩溃。
也许它与蚂蚁有关,我必须在manfest中添加dll ...查看文档并找不到如何完成的方法。
在64位系统上使用相应的JVM(64位)然后什么都不崩溃=))
答案 0 :(得分:2)
由于在64位操作系统上使用了32位JVM,因此发生崩溃。在这种情况下,似乎加载了32位dll,这就是发生崩溃的原因。
问题只能在英特尔显卡上重现,我认为它可以被认为是一个严重的错误。如果英特尔想要解决它或提出一个有效的解决方案/解决方案,这可能会很棒! =)
答案 1 :(得分:1)
避免在Swing Event Dispatch Thread中执行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实现假设您不希望出现多个视口。如果没有问题,您可以将其重新编码为仅支持一个视口,并且由于代码更简单,您不应该崩溃。