У меня есть простое Java-приложение, использующее JOGL. Когда я запускаю его из 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 и всего перечисленного в этом примере), и эта проблема осталась.
Как правило, приложение работает нормально, шейдеры компилируются и связываются без проблем (я использовал проверку, которую не показывал в этом примере), и оно отображает то, что нужно. Единственная проблема заключается в том, что javaw.exe продолжает работать после закрытия окна приложения (нажав x в углу окна).
Эта проблема устранена, только если я закомментирую mGl.glCompileShader(mVsId);
и последующие строки. Если я оставлю эту строку, javaw.exe останется запущенным, поэтому я предполагаю, что проблема связана с кодом инициализации/уничтожения шейдера.
Кроме того, glGetError() возвращает 0 (нет ошибки) в конце initialize() и 0x502 (GL_INVALID_OPERATION) в начале destroy(). Между ними есть только основной цикл и никаких вызовов opengl, о которых я знаю, поскольку для тестирования я закомментировал весь код рендеринга.
Любые идеи?
Редактировать 3 октября 2012 г.:
Я до сих пор не знаю, в чем проблема, но поскольку я обновил драйверы своей графической карты, «javaw.exe» завершается, как и должно быть, после закрытия приложения. У меня AMD Radeon HD 6870. Моя текущая версия драйвера — 8.982 от 27 июля 2012 г., и я не могу вспомнить, какая была последняя версия, но я думаю, что она была выпущена примерно в январе 2011 года.
Однако glGetError() по-прежнему возвращает 0x502 в начале уничтожения, поэтому я предполагаю, что что-то не так.