gpt4 book ai didi

java - 我如何(正确地)在纯 Java 中以高帧率渲染

转载 作者:行者123 更新时间:2023-11-29 04:25:21 29 4
gpt4 key购买 nike

我一直在尝试用纯 Java 制作一个简单的游戏,但在绘图时遇到了问题。我正在尝试保持相对较高的帧速率,但是 JFrame.repaint() 不能被“强制”并且只是在下一个可用机会重绘帧的请求这一事实存在问题。结果,下面代码的帧率很糟糕。但是,(这是奇怪的部分)它似乎只有在我的鼠标不动时才会很糟糕。如果我的鼠标在窗口上方移动和移动,则帧速率快速且清晰。

我尝试了各种在线建议,甚至编译了有关如何执行此操作的示例,它们似乎都存在相同的问题,即当我的鼠标未在窗口上移动时帧速率会急剧下降。

(如果重要的话,我正在使用 Linux)

非常感谢任何帮助!

import java.awt.*;
import javax.swing.*;


public class Test extends JPanel {


public static void main(String[] args) {

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(300, 300));
frame.setVisible(true);
frame.getContentPane().add(new Test());


for (int k = 0; k < 1_000_000; k++) {
frame.repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(1);
}
}

frame.dispose();
System.exit(0);
}



private int k = 0;

public Test() {
super();
}

@Override public void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());

g.setColor(Color.BLACK);
int height = (int) (((k * 0.01) % 1) * getHeight());
g.drawLine(
0, height,
getWidth(), height
);

k++;

}

}

最佳答案

经过大量研究,事实证明 java 不会在许多 Linux 系统上自动同步/刷新显示缓冲区。所有重绘等都是正确的,但是显示缓冲区没有刷新,因此产生了奇怪的滞后效果。

解决方案:

Toolkit toolkit = Toolkit.getDefaultToolkit(); /* get AWT toolkit */

/* initialize things */
...

while (your_loop) {

/* run your logic */
...

/* paint everything */
...

toolkit.sync(); /* force display buffer to flush */
}

谢谢大家的参与

关于java - 我如何(正确地)在纯 Java 中以高帧率渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46626715/

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