最近我使用LWJGL制作了一个应用程序,我决定将JFrame设置为显示的父级。我这样做是因为它提供了更好的调整大小和移动功能。特别是在windows上,LWJGL似乎有一个错误,当移动和调整大小时,应用程序会冻结。
问题是,当我在我的mac上尝试应用程序时,它比我的windows电脑快得多,性能真的很差。当我在mac上使用常规的本机显示时,它在60fps下运行流畅,但奇怪的是:当我在mac上的JFrame中运行它时,fps似乎不受影响,仍然是60,但它看起来非常不稳定,尤其是在全屏时。就好像显示器每5帧或更多帧才更新一次,尽管逻辑似乎会像应该的那样更新每一帧。为什么会这样?有什么方法可以修复它吗?这是窗口初始化代码:
public JFrame frame;
public final Canvas frameCanvas = new Canvas();
private static boolean closeRequested = false;
private final static AtomicReference<Dimension> newCanvasSize = new AtomicReference<Dimension>();
public BaseGame()
{
this.frame = new JFrame("Game");
this.frame.setLayout(new BorderLayout());
this.frameCanvas.addComponentListener(new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent e)
{
newCanvasSize.set(BaseGame.this.frameCanvas.getSize());
}
});
this.frame.addWindowFocusListener(new WindowAdapter()
{
@Override
public void windowGainedFocus(WindowEvent e)
{
BaseGame.this.frameCanvas.requestFocusInWindow();
}
});
this.frame.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
closeRequested = true;
}
});
this.frame.add(this.frameCanvas, BorderLayout.CENTER);
try
{
Display.setParent(this.frameCanvas);
Display.setVSyncEnabled(true);
this.frame.setPreferredSize(new Dimension(800, 500));
this.frame.setMinimumSize(new Dimension(400, 400));
this.frame.pack();
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
this.frame.setLocation(dim.width / 2 - this.frame.getSize().width / 2, dim.height / 2 - this.frame.getSize().height / 2);
this.frame.setVisible(true);
Display.create();
this.runTick();
Display.destroy();
this.frame.dispose();
System.exit(0);
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void runTick()
{
this.initGL();
Dimension newDim;
this.resize(this.frameCanvas.getWidth(), this.frameCanvas.getHeight(), Display.isFullscreen());
while (!Display.isCloseRequested() && !closeRequested)
{
thisFrame = getCurrentTime();
newDim = newCanvasSize.getAndSet(null);
if (newDim != null)
{
this.resize(this.frameCanvas.getWidth(), this.frameCanvas.getHeight(), Display.isFullscreen());
}
this.updateTick();
this.renderTick();
Display.update();
Display.sync(60);
}
}
public void initGL()
{
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GL11.glClearDepth(1);
GL11.glViewport(0, 0, 800, 500);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 800, 500, 0, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
}
public void resize(int width, int height, boolean fullScreen)
{
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glViewport(0, 0, width, height);
GLU.gluPerspective(45.0f, ((float) width) / ((float) height), 0.1f, 100.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
}
如果使用LWJGL,请不要使用JFrame。摇摆是你麻烦的根源。使用LWJGL的优化窗口:
设置窗口:
Display.setDisplayMode(new DisplayMode(width,height));
Display.create();
和键盘:
Keyboard.isKeyDown(Keyboard.KEY_ESCAPE);
您需要在main方法中创建一个循环,如下所示:
while (!done) {
// Update anything you want to update.
// Clear screen.
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glLoadIdentity();
// Render stuff.
Display.update();
// Optional VSync.
Display.sync(FRAME_RATE);
}
我正在努力使用LWJGL使用OpenGL创建一个带有照明引擎的2D Java游戏,但是在尝试链接键盘输入时,我遇到了一堵墙。 渲染循环工作正常,但当我尝试实现JFrame/canvas和getParent/keylister组合时,应用程序在启动后立即崩溃。我必须在netbeans中关闭应用程序-窗口不会响应右键单击开始工具栏中的应用程序条目。 当然,在这一点之后还有更多代码,但它都已经过测试并正
有问题显示纹理在我的3D框在LWJGL使用光滑。早些时候我犯了一个错误: BasicShader类: BasicVertex.vs basicfragment.fs
问题内容: 我想做的事: 我想列出数据库的一些记录。此列表应显示在 JFrame弹出窗口中。 描述: 我有3节课: Main.java(运行程序) PeopleTableModel.java(保存数据,扩展AbstractTableModel) PeopleTable.java(保存逻辑,扩展JTable) 将JFrame设置为 可见时,为什么会出现ArrayIndexOutOfBoundsExc
一个没有显示添加到它的的问题。我已经尝试了,我已经切换到只添加,以使代码更短一些。任何帮助都是非常感谢的!
问题内容: 我一直在尝试并且无法在OSX系统的主显示屏上使用Java全屏模式。无论我尝试了什么,似乎都无法摆脱显示屏顶部的“苹果”菜单栏。我真的需要在整个屏幕上绘画。谁能告诉我如何摆脱菜单? 我已经附上了一个显示问题的示例类-在我的系统上,菜单仍然可见,我希望看到一个完全空白的屏幕。 问题答案: 我认为您的问题在这里: 块总是执行,所以这里发生的是,您的窗口在短时间内(如果有的话)变为全屏,然后立
我已将 LWJGL 安装到 Java 项目中,但无法导入 Display 类。 给出无法解决的错误。 DisplayMode和其他类也丢失。我在broswer里找不到他们。