Java 游戏循环导致 Ubuntu 冻结

Java 游戏循环导致 Ubuntu 冻结

我从事前端和后端 Web 编程已有一年多了,现在我正在尝试学习 Java 2D 游戏编程。根据网络上的各种来源以及我的朋友(一位经验丰富的游戏开发人员)的资料,这是一个典型的设置:

窗口.java| 窗口设置类

游戏.java| 主游戏类

但是当我尝试运行该类时Game,框架打开然后冻结,我唯一能控制的是我的鼠标,没有别的。我知道问题出现在方法中render,因为当该方法有一个空体时,程序运行良好。

我从教程中复制了代码,运行良好,而我的朋友给我发了一个几乎相同的版本,在他的电脑上运行良好,但同样导致我的电脑死机。在教程和我朋友的测试中,操作系统都是 Windows,这让我相信这完全是 Ubuntu/Linux 的问题。

我有一个 Intel i7 3.4gHZ 处理器和 8GB 的​​ RAM,所以处理和内存不应该是这里的问题。有什么想法知道发生了什么吗?我知道这更像是一个编程问题,但事实上这个问题似乎是 Ubuntu 特有的,这让我把它发布在这里。

编辑

我将问题集中到 Game 类中的一行:bs.show()。出于某种原因,当我尝试显示缓冲策略时,它就会冻结。如果我使用 1 个缓冲区创建缓冲策略,它会正常工作,如果缓冲区大于 1,它就会冻结。

最近一次死机时,我打开了一个虚拟桌面并运行top,最奇怪的是 Java 占用了不到 2% 的 CPU 和 6% 的内存。这根本说不通。我真的需要一些帮助来解决这里发生的事情,我已经尽力了,我不想再强制重启我的机器了。

答案1

我在运行您的代码时遇到了同样的问题。这似乎是性能问题。要修复它,请System.setProperty("sun.java2d.opengl", "true");像这样添加到 Game.java 中的 main 方法中,

 public static void main(String args[]) {
    System.setProperty("sun.java2d.opengl", "true");
    new Game();
 }

希望这可以帮助!

答案2

您使用的是主 awt 线程本身。它应该单独留着以满足用户响应能力。阅读一些关于使用SwingUtilities2.invokeLaterSwingUtilities2.invokeAndWait方法来消除 Java Swing 应用程序中的冻结窗口问题的信息。

做法是:

1)在 Runnable 中执行大量操作(您正在使用一个)

2)在主方法中,将 Runnable 实例传递给 SwingUtilities2 类中的上述两个方法之一

如果您想要更进一步,您还可以考虑使用 Worker Threads。

相关内容