Java 隐藏画布时丢失AWT DrawingSurface

Java 隐藏画布时丢失AWT DrawingSurface,java,opengl-es,awt,rendering,jawt,Java,Opengl Es,Awt,Rendering,Jawt,我正在为AWT/Swing应用程序编写3d渲染模块 为了提供良好的FPS,我不能使用Swing/AWT方法和图形绘制。相反,我从Canvas元素获取绘图表面,然后直接渲染到它。大概是这样的: public class Window { private Component canvas; private JAWTDrawingSurface ds; public static final JAWT awt; static { awt = JAWT

我正在为AWT/Swing应用程序编写3d渲染模块

为了提供良好的FPS,我不能使用Swing/AWT方法和图形绘制。相反,我从Canvas元素获取绘图表面,然后直接渲染到它。大概是这样的:

public class Window {

    private Component canvas;
    private JAWTDrawingSurface ds;

    public static final JAWT awt;
    static {
        awt = JAWT.calloc();
        awt.version(JAWT_VERSION_1_4);
        if (!JAWT_GetAWT(awt))
            throw new AssertionError("GetAWT failed");
    }

    public void lock() throws AWTException {
        int lock = JAWT_DrawingSurface_Lock(ds, ds.Lock());
        if ((lock & JAWT_LOCK_ERROR) != 0)
            throw new AWTException("JAWT_DrawingSurface_Lock() failed");
    }

    public void unlock() throws AWTException {
        JAWT_DrawingSurface_Unlock(ds, ds.Unlock());
    }

    public void Init2()
    {    
        this.ds = JAWT_GetDrawingSurface(canvas, awt.GetDrawingSurface());
        try
        {
            lock();
            // Create GL Capabilities
            unlock();
        }
     }
public void Reinit()
{
    System.err.println("Context Reinit()");

    this.ds = JAWT_GetDrawingSurface(canvas, awt.GetDrawingSurface());
    try
    {
        lock();
        try
        {
            JAWTDrawingSurfaceInfo dsi = JAWT_DrawingSurface_GetDrawingSurfaceInfo(ds, ds.GetDrawingSurfaceInfo());

            JAWTX11DrawingSurfaceInfo dsiWin = JAWTX11DrawingSurfaceInfo.create(dsi.platformInfo());

            this.display = dsiWin.display();
            this.drawable = dsiWin.drawable();

            eglDisplay = eglGetDisplay(display);

            surface = eglCreateWindowSurface(eglDisplay,fbConfigs.get(0),drawable,(int[])null);

            eglMakeCurrent(eglDisplay,surface,surface,context);

            GLES.setCapabilities(glesCaps);

            JAWT_DrawingSurface_FreeDrawingSurfaceInfo(dsi, ds.FreeDrawingSurfaceInfo());
        }
        finally
        {
            unlock();
            System.err.printf("Unlock \n");
        }

    }
    catch (Exception e)
    {
        System.err.println("JAWT Failed" + e.getMessage());
    }
}
当我第一次叫它的时候,它工作得很好。 但是当我出于任何原因(例如最小化窗口或显示另一个面板而不是画布)隐藏画布时,ds变量保持不变,但之后就不起作用了。 基本上,即使我确保只在变量可见且位于顶部时调用该变量,任何使用ds的调用都会抛出异常。例如,lock()函数停止工作

我想知道为什么会这样

另外,如果我再次最小化然后最大化窗口,我试图基本上获得一个新的DS,但这也不起作用-新的DS地址会按它应该的方式返回,但我不能使用那个新对象,就像我不能使用原始对象一样

我可能遗漏了一些愚蠢的东西,但我不知道是什么。 请帮我整理一下。谢谢大家!

解决方案:

隐藏画布时,调用eglmakefurrent(eglDisplay、EGL_NO_SURFACE、EGL_NO_SURFACE、EGL_NO_CONTEXT)以解除当前上下文的绑定

当需要再次开始绘图时,需要执行以下操作:

public class Window {

    private Component canvas;
    private JAWTDrawingSurface ds;

    public static final JAWT awt;
    static {
        awt = JAWT.calloc();
        awt.version(JAWT_VERSION_1_4);
        if (!JAWT_GetAWT(awt))
            throw new AssertionError("GetAWT failed");
    }

    public void lock() throws AWTException {
        int lock = JAWT_DrawingSurface_Lock(ds, ds.Lock());
        if ((lock & JAWT_LOCK_ERROR) != 0)
            throw new AWTException("JAWT_DrawingSurface_Lock() failed");
    }

    public void unlock() throws AWTException {
        JAWT_DrawingSurface_Unlock(ds, ds.Unlock());
    }

    public void Init2()
    {    
        this.ds = JAWT_GetDrawingSurface(canvas, awt.GetDrawingSurface());
        try
        {
            lock();
            // Create GL Capabilities
            unlock();
        }
     }
public void Reinit()
{
    System.err.println("Context Reinit()");

    this.ds = JAWT_GetDrawingSurface(canvas, awt.GetDrawingSurface());
    try
    {
        lock();
        try
        {
            JAWTDrawingSurfaceInfo dsi = JAWT_DrawingSurface_GetDrawingSurfaceInfo(ds, ds.GetDrawingSurfaceInfo());

            JAWTX11DrawingSurfaceInfo dsiWin = JAWTX11DrawingSurfaceInfo.create(dsi.platformInfo());

            this.display = dsiWin.display();
            this.drawable = dsiWin.drawable();

            eglDisplay = eglGetDisplay(display);

            surface = eglCreateWindowSurface(eglDisplay,fbConfigs.get(0),drawable,(int[])null);

            eglMakeCurrent(eglDisplay,surface,surface,context);

            GLES.setCapabilities(glesCaps);

            JAWT_DrawingSurface_FreeDrawingSurfaceInfo(dsi, ds.FreeDrawingSurfaceInfo());
        }
        finally
        {
            unlock();
            System.err.printf("Unlock \n");
        }

    }
    catch (Exception e)
    {
        System.err.println("JAWT Failed" + e.getMessage());
    }
}
如您所见,我重新创建了显示和曲面,但我使用先前创建的上下文进行渲染,而无需重新创建