gpt4 book ai didi

java - JFrame 中的 LWJGL 显示在 OSX 上性能较差

转载 作者:行者123 更新时间:2023-12-02 05:44:35 24 4
gpt4 key购买 nike

我最近正在使用LWJGL制作一个应用程序,我决定将JFrame设置为显示的父级。我这样做是因为它提供了更好的调整大小和移动功能。特别是在 Windows 上,LWJGL 似乎存在 bug,导致应用程序在移动和调整大小时卡住。

问题是,当我在比我的 Windows 计算机快得多的 Mac 上尝试该应用程序时,性能确实很差。当我在 mac 上使用常规 native 显示时,它以 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。 Swing 是你麻烦的根源。使用LWJGL的优化窗口:

设置窗口:

Display.setDisplayMode(new DisplayMode(width,height));
Display.create();

和键盘:

Keyboard.isKeyDown(Keyboard.KEY_ESCAPE);

您需要在主方法中使用一个如下所示的循环:

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);
}

关于java - JFrame 中的 LWJGL 显示在 OSX 上性能较差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com