【问题标题】:JMonkeyEngine crash on Intel video adapter英特尔视频适配器上的 JMonkeyEngine 崩溃
【发布时间】:2012-01-09 20:54:51
【问题描述】:

我在我的应用程序中使用 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 上崩溃。

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

解决方案:

在 64 位系统上必须使用相应的 JVM(64 位),然后什么都不会崩溃 =))

【问题讨论】:

  • 鉴于您没有在其他硬件上遇到崩溃,问题几乎肯定与驱动程序有关,这意味着答案的要点归结为无用但准确的“是的,那是英特尔给你的司机”。确保您的驱动程序是最新的,然后重试。如果您发布生成的 hs_err_pid168.log 文件的堆栈跟踪部分(打开它,它只是一个文本文件),这至少可能有助于确定哪些调用导致了崩溃。
  • 日志看起来像这样:sergpank.heliohost.org/log.html希望它说明了这个问题 =)

标签: java opengl lwjgl jmonkeyengine graphical-programming


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,我注意到它在 64 位系统上可以工作,但仅适用于 64 位 jre,即使代码是使用 32 位 jdk 编译的..
    • 还注意到英特尔驱动程序与 gl_quads 存在问题:communities.intel.com/thread/24803
    • @sergpank 不管你的代码是用 32 位还是 64 位 JDK 编译的; Java 字节码独立于平台的“位数”。没有 32 位或 64 位 Java 字节码。
    • @sergpank(据我所知)如果您使用的是 32 位本机库,那么您需要 32 位 JRE;如果您使用的是 64 位本机库,则需要 64 位 JRE。原则上 32 位库也应该在 64 位系统上运行,但您使用的库可能存在特定问题。
    • @sergpank 如果它真的只发生在英特尔显卡上而不是其他品牌的显卡上,那很可能是英特尔显卡驱动程序中的一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多