JOGL: javax.media.opengl.GLException: AWT-EventQueue-0: контекст не актуален для потока

Я создаю игру с JOGL, и я столкнулся с ошибкой, которую я не могу понять на всю жизнь.

В игре я использую две GLCanvases (на самом деле GLJpanels), одну для меню и одну для реальной игры. Идея заключается в том, что когда игра запускается из меню, меню GLCanvas удаляется из окна игры и заменяется для игры GLCanvas. До сих пор я заставил меню работать почти идеально, но всякий раз, когда я пытаюсь переключиться на холст игры, я получаю эту ошибку:

Catched Exception on thread AWT-EventQueue-0
javax.media.opengl.GLException: AWT-EventQueue-0: Context not current on thread, obj 0x2ab44e2d, ctx 0x0, surf 0x0, inDestruction: false, <53f7c06e, 2e7aa0d3>[count 0, qsz 0, owner <NULL>]

Код, который я использую для переключения между холстами:

public void start()
{
    canvas.addGLEventListener(this);
    animator.start();
    window.add(canvas);
    canvas.requestFocus();
}
public void stop()
{
    window.remove(canvas);
    animator.stop();
    canvas.removeGLEventListener(this);
}

и функция переключателя:

public void switchToCanvas(String canvasName)
{
    currentCanvas = canvasName;

    if(canvasName.equals("GameCanvas"))
    {
        menu.stop();
        game.start();
    }
    else
    {
        game.stop();
        menu.start();
    }
}

Я немного погуглил и натолкнулся на вопрос: как я могу создать свой собственный контекст openGL и связать его с GLCanvas?

Но ни одно из опубликованных там решений не помогло мне.

1 ответ

Сначала я бы предпочел использовать один GLCanvas вместо двух экземпляров GLJPanel. GLJPanel имеет больший объем памяти и должен использоваться только тогда, когда нельзя использовать GLWindow или AWT/SWT GLCanvas, когда есть проблемы со смешиванием тяжелых и легких компонентов.

Во-вторых, ваше сообщение об ошибке означает, что в этом потоке нет контекста OpenGL. Вы должны использовать GLAutoDrawable.invoke() для помещения задач OpenGL в очередь, или вы должны сделать контекст текущим, когда вам это нужно. Я советую вам посмотреть на jogl-demos, чтобы увидеть, как мы это делаем в наших примерах.

Редактировать.: С сопровождающими JogAmp, включая меня, можно легко связаться на официальном форуме ( http://forum.jogamp.org/) и на IRC.

Другие вопросы по тегам