2012-09-29 79 views
1

我有一个简单的使用JOGL的java应用程序。当我从eclipse运行它,然后关闭应用程序窗口时,javaw.exe仍然在运行。下面是相关代码:JOGL 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()在destroy()初始的initialize()和0x502(GL_INVALID_OPERATION)结尾处返回0(无错误)。我知道只有主循环之间没有opengl调用,因为为了测试,我将所有渲染代码注释掉了。

任何想法?

编辑2012年10月3日:

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

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

+0

嗨,看看这个[示例](https://jogamp.org/wiki/index.php/Jogl_Tutorial#Hello_Triangle) – elect

回答

1

假设您使用jogamp.org的JOGL,请使用我们的SWT GLCanvas 或我们的NEWTCanvasSWT。 由于定制的GLCapabilities,后者是首选,请检查API文档。 这给你加上你正在SWT线程(读取 链接单元测试)做所有SWT相关,恕我直言,它应该工作 - 至少我们的单元测试。

由于您在更新(GPU /驱动程序)后提到您的故障已不复存在,因此可能是驱动程序问题 。

现在到您的GL错误。 Trace GL错误可以简单地通过设置系统属性'jogl.debug.DebugGL'完成,即在命令行“-Djogl.debug.DebugGL”上。 这将自动安装GL对象的调试流水线,并检查GL错误,如果出现GL错误,将引发GLException。

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

+0

首先,谢谢你的回应:)。我使用的是org.eclipse.swt.opengl.GLCanvas,它被我发现的一些例子所使用,所以我也使用它。我会尝试你提到的。另外'jogl.debug.DebugGL'在我的情况下什么都不做,而我仍然得到错误代码0x502。我是java中的新手,所以我可能会将其设置为错误 - 这是我在主属性props = System开始时所做的。的GetProperties(); props.setProperty(“jogl.debug.DebugGL”,“true”); – mrzli

相关问题