Java 隐藏画布时丢失AWT DrawingSurface
我正在为AWT/Swing应用程序编写3d渲染模块 为了提供良好的FPS,我不能使用Swing/AWT方法和图形绘制。相反,我从Canvas元素获取绘图表面,然后直接渲染到它。大概是这样的: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
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());
}
}
如您所见,我重新创建了显示和曲面,但我使用先前创建的上下文进行渲染,而无需重新创建