首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐藏画布时丢失AWT DrawingSurface

隐藏画布时丢失AWT DrawingSurface
EN

Stack Overflow用户
提问于 2020-02-20 03:45:52
回答 1查看 80关注 0票数 0

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

为了提供良好的FPS,我不能使用Swing/AWT方法和图形绘制。相反,我从画布元素中获取绘图曲面,然后直接呈现给它。就像这样:

代码语言:javascript
复制
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();
        }
     }

我第一次叫它的时候很好。但是,当我出于任何原因(例如最小化窗口或显示另一个面板而不是画布)隐藏画布时,ds变量保持不变,但在那之后就不能工作了。基本上,即使我确保只在可见和顶部调用变量-任何使用ds的调用都会引发异常。例如,lock()函数停止工作。

我在想为什么?

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

我可能错过了一些愚蠢的东西,但我想不出是什么。请帮我解决这个问题。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-26 05:37:16

解决办法:

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

当您需要再次开始绘图时,您需要这样做:

代码语言:javascript
复制
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());
    }
}

正如您所看到的,我重新创建了显示和曲面,但是我使用先前创建的上下文进行呈现,而不需要重新创建它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60312611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档