隐藏Canvas时丢失AWT DrawingSurface

问题描述 投票:0回答:1

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

为了提供良好的FPS,我无法使用Swing / AWT方法和图形进行绘制。相反,我从Canvas元素获取了Drawing Surface,然后直接对其进行渲染。像这样的东西:

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();
        }
     }

第一次调用时效果很好。但是当我出于任何原因隐藏画布时(例如,最小化窗口或显示另一个面板而不是Canvas),ds变量保持不变,但此后不起作用。基本上,即使我确定仅在可见且位于顶部时才调用变量,使用ds的任何调用都将引发异常。例如,lock()函数停止工作。

我想知道为什么吗?

[此外,如果我最小化然后再次最大化窗口,我也试图从根本上获得一个新的DS,但这也行不通-新的DS地址将按原样返回,但是我不能像使用新对象那样我无法使用原始版本。

我在这里可能缺少一些愚蠢的东西,但我不知道是什么。请帮我解决这个问题。谢谢!

java opengl-es awt rendering jawt
1个回答
0
投票

解决方案:

当隐藏画布时,调用eglMakeCurrent(eglDisplay,EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT)以取消绑定当前上下文。

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

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());
    }
}

如您所见,我重新创建了显示和表面,但是我使用先前创建的上下文进行渲染,而无需重新创建它。

© www.soinside.com 2019 - 2024. All rights reserved.