【问题标题】:jogl native crash on call to glDisable调用 glDisable 时 jogl 本机崩溃
【发布时间】:2012-01-13 15:43:50
【问题描述】:

我有一个 jogl 应用程序(本机)在调用 glDisable 时崩溃(我认为堆栈的细节在这里并不重要 - 它是在 EDT 上发生的调用)。

我的问题实际上是关于 glDisable 如何可能导致本机崩溃。它总是被传递一个有效的禁用标志。

我对此有两个想法:

1) 显卡bug(虽然我试过更新驱动,但还是只出现在部分电脑上,所以还是有可能是显卡相关)。

2) Java 应用程序正在使用大量内存。我不知道是否有可能如果分配了太多内存,本机代码中可能会发生坏事。虽然如果只是高度使用的 Java 内存,而不是整个系统内存,我认为该错误将显示为 Java 错误。

对这实际上如何发生有什么想法吗?

【问题讨论】:

    标签: opengl native jogl


    【解决方案1】:

    大多数时候,OpenGL 会通过忽略包含错误的调用来处理它自己的错误,但也有一些错误会使您的应用程序崩溃。我遇到的唯一的问题是访问违规和不良驱动程序。我感觉这不是glDisable 调用(它只能遇到GL_INVALID_ENUMGL_INVALID_OPERATION 错误,OpenGL 本身使用glGetError 处理),而是之前的那个。

    看看错误周围的代码会很好,但我会假设它是在纹理加载(glTexImage2D)或绘制调用(gl*PointerglDraw*)期间。如果您的长度变量大于纹理/缓冲区的实际内存,OpenGL 仍将尝试从这些地址读取,并且操作系统应抛出访问冲突异常。仔细检查这些变量并记住除了glDraw* 调用之外的所有内容都使用字节长度,那些使用元素的数量。

    如果这不是您的问题,那么您的 glDisable 调用是您进行的第一个实际 OpenGL 调用,错误是 JOGL 找不到 opengl32.dll 或 libgl.so 或任何 OpenGL 实现在您的操作系统上。在这种情况下,您只需要安装正确的驱动程序就可以了。有时,如果您调用在驱动程序支持之后的版本中引入 OpenGL 的方法,您会得到同样的错误。您可以使用glGetString(GL_VERSION) 检查您的 OpenGL 版本。

    【讨论】:

    • 我的想法也是它与纹理加载有关,但是当我查看生成的本机日志时(这是在用户的 PC 上,所以我这里没有完整的日志) ,它显示违规发生的调用是对 glDisable 的调用,这就是我对此感到困惑的原因。
    • glDisable 不应修改/访问任何 RAM。首先,我会要求用户重新安装他的显卡驱动程序,如果这不起作用,请尝试获取日志/堆栈跟踪,查找周围的调用。如果没有其他内容,请在您的程序中搜索 glDisable 调用,然后查看在此之前进行了哪些 OpenGL 调用。您可以使用glslDevilgDEBugger 之类的工具来帮助您。
    • 谢谢,我们正在重新安装显卡驱动程序,希望能解决问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多