当前位置: 首页 > 知识库问答 >
问题:

JFrame中的LWJGL显示在OSX上表现不佳

燕寒
2023-03-14

最近我使用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();
}

共有1个答案

柴博
2023-03-14

如果使用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里找不到他们。