java - 应用程序关闭后 JOGL javaw.exe 仍保持运行

标签 java opengl jogl

我有一个使用 JOGL 的简单 java 应用程序。当我从 eclipse 运行它,然后关闭应用程序窗口时,javaw.exe 仍然运行。相关代码如下:

public class App {
    private Display mDisplay;
    private Shell mShell;
    private GL4 mGl;
    private int mProgramId;
    private int mVsId;
    private int mFsId;

    // ...

    public void start() {
        if (!initialize()) {
            return;
        }

        while (!mShell.isDisposed()) {
            if (!mDisplay.readAndDispatch()) {
                mDisplay.sleep();
            }
        }

        destroy();
    }

    private void initialize() {
        mDisplay = new Display();
        mShell = new Shell(mDisplay);

        // some SWT and opengl initialization code, which is irrelevant for this issue
        // (at least I think so)
        // getting GLProfile, GLContext, GL4 etc.

        final String vsText = ResourceManager.getShaderText(vsPath);
        final String fsText = ResourceManager.getShaderText(fsPath);

        mVsId = mGl.glCreateShader(GL4.GL_VERTEX_SHADER);
        mFsId = mGl.glCreateShader(GL4.GL_FRAGMENT_SHADER);

        mGl.glShaderSource(mVsId, 1, new String[] { vsText }, null, 0);
        mGl.glCompileShader(mVsId);

        mGl.glShaderSource(mFsId, 1, new String[] { fsText }, null, 0);
        mGl.glCompileShader(mFsId);

        mProgramId = mGl.glCreateProgram();

        mGl.glAttachShader(mProgramId, mFsId);
        mGl.glAttachShader(mProgramId, mVsId);

        // bind a constant attribute location for positions of vertices
        mGl.glBindAttribLocation(mProgramId, 0, "in_Position");
        // bind another constant attribute location, this time for color
        mGl.glBindAttribLocation(mProgramId, 1, "in_Color");
        mGl.glLinkProgram(mProgramId);

        // here error code is 0x0 (no error)
        int error = mGl.glGetError();

        mShell.open();

        return true;
    }

    private void destroy() {

        // here error code is 0x502 (GL_INVALID_OPERATION)
        int error = mGl.glGetError();

        mGl.glDetachShader(mProgramId, mFsId);
        mGl.glDetachShader(mProgramId, mVsId);

        mGl.glDeleteShader(mFsId);
        mGl.glDeleteShader(mVsId);
        mGl.glDeleteProgram(mProgramId);

        mDisplay.dispose();
    }
}

我注释掉了所有渲染代码和大多数其他 opengl/JOGL 相关调用(除了获取 GLProfile、GLContext、GL4 和本示例中列出的所有内容),并且此问题仍然存在。

通常,应用程序工作正常,着色器编译和链接没有问题(我使用了在此示例中未显示的验证),并且它显示了它需要的内容。唯一的问题是,在我关闭应用程序窗口(通过按窗口角上的 x)后,javaw.exe 仍然运行。

仅当我注释掉 mGl.glCompileShader(mVsId); 和后续行时,此问题才会消除。如果我离开这一行,javaw.exe将继续运行,所以我猜问题与着色器初始化/销毁代码有关。

此外,glGetError() 在initialize() 结束时返回0(无错误),在destroy() 开始时返回0x502 (GL_INVALID_OPERATION)。据我所知,中间只有主循环,没有 opengl 调用,因为为了测试,我注释掉了所有渲染代码。

有什么想法吗?

编辑2012年10月3日:

我仍然不知道问题是什么,但由于我更新了显卡驱动程序,“javaw.exe”在应用程序关闭后按其应有的方式终止。我有AMD Radeon HD 6870。我当前的驱动程序版本是2012年7月27日的8.982,我不记得最后一个版本是什么,但我相信它是从2011年1月左右开始的。

但是,glGetError()在destroy开始时仍然返回0x502,所以我猜还是有问题。

最佳答案

假设您使用来自 jogamp.org 的 JOGL,请使用我们的 SWT GLCanvas 或我们的NEWTCanvasSWT 。 由于自定义 GLCapability,后者是首选,请检查 API 文档。 加上您正在 SWT 线程上执行与 SWT 相关的所有操作(请阅读 链接的单元测试),恕我直言,它应该可以工作 - 至少我们的单元测试。

自从您提到更新(GPU/驱动程序)后您的问题就不再存在, 这可能是驱动程序问题。

现在看看你的总帐错误。跟踪 GL 错误可以简单地通过设置系统属性“jogl.debug.DebugGL”来完成,即在命令行“-Djogl.debug.DebugGL”上。 这将自动为您的 GL 对象安装调试管道并检查 GL 错误,如果出现错误,将抛出 GLException。

您还可以通过属性“jogl.debug.TraceGL”进行跟踪。

关于java - 应用程序关闭后 JOGL javaw.exe 仍保持运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12652913/

相关文章:

带有controlsfx通知组件的javafx NullPointerException

java - 构建从本地主机到 google.com 的套接字时出现错误

java - 使用 Jersey 和 Tomcat 设置 Jackson 2

java - 如何使 JOGL 2.0 与 SWT 一起工作?

java - 解析全名?

opengl - 针对昂贵的片段着色器进行优化

c++ - OpenGL 相机旋转不起作用

opengl - 为几何吞吐量调整 OpenGL 性能

java - JOGL 纹理不起作用

java - glReadPixels() 返回零数组