我正在为 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();
}
}
当我第一次调用它时它工作正常。但是当我出于任何原因隐藏画布时(例如最小化窗口或显示另一个面板而不是画布),ds变量保持不变,但在那之后它就不起作用了。基本上,即使我确保仅在变量可见且位于顶部时才调用该变量 - 任何使用ds的调用都会引发异常。例如lock()函数停止工作。
我想知道为什么会这样?
如果我最小化然后再次最大化窗口,我也尝试基本上获得一个新的 DS,但这也不起作用 - 新的 DS 地址按原样返回,但我不能像我一样使用那个新对象不要用原来的。
我可能在这里遗漏了一些愚蠢的东西,但我不知道是什么。请帮我解决这个问题。谢谢!