我目前正在用Java完全开发游戏。截至目前,我的主循环正在一个Action Performed方法中运行,该方法每100秒由一个计时器更新。在那个循环中,代码重新绘制并为玩家位置,敌人位置等进行了一系列数学计算。我的代码运行正常并且在我2009年中期的macbook pro上没有太多差距,并且奇怪的是我的代码运行得非常糟糕朋友(非常)新的Surface Pro 4(一台非常出色的机器)。它在我的(AMD)台式机上运行得非常好。我使用VisualVM和任务管理器运行了一些诊断和一些示例,虽然它不占用大部分机器资源,但它在Surface Pro上以4或5 FPS运行,主要是因为我的绘图组件。我的痛苦(t)成分是巨大的,它包含了大量的arraylists中的粒子循环,arraylists中的敌人,arraylists中的敌人粒子等等。所有这些都需要绘制。 (它们会随着时间的推移而删除,因此不是问题)。为什么我的旧macbook在运行这个程序方面比我的朋友新表面专业人士好多了?有没有更好的方法来运行代码? Github链接到这里:https://github.com/gkgkgkgk/JetGame谢谢! (另外,如果可以的话,请在您的计算机上测试它并让我知道它是如何运行的!)
这是我最小的,可验证的代码:
public class Test extends JPanel implements KeyListener {
JFrame w;
Timer t = new Timer();
double elapsedTime = 0.016;
public Test() {
w = new JFrame();
w.setSize(1280, 720);
w.setContentPane(this);
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w.addKeyListener(this);
w.setResizable(false);
w.setVisible(true);
loop();
}
public void loop() {
t.scheduleAtFixedRate(new TimerTask() {
public void run() {
//does calculations
repaint();
}
}, 0, 16);
}
public void keyPressed(KeyEvent e) {
//booleans are set to true and falso for movement in these methods
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g; // Create a Java2D version of g.
//painting is done in a bunch of nested for loops here
}
void calculateFPS(long x) {
System.out.println(1000 / (System.currentTimeMillis() - x) + "FPS");
}
public static void main(String[] args) {
new Test();
}
}
答案 0 :(得分:0)
您应该尝试创建自己的游戏循环,而不依赖于util定时器。
网上有很多关于如何编写工作单的例子。