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