我从事前端和后端 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.invokeLater
和SwingUtilities2.invokeAndWait
方法来消除 Java Swing 应用程序中的冻结窗口问题的信息。
做法是:
1)在 Runnable 中执行大量操作(您正在使用一个)
2)在主方法中,将 Runnable 实例传递给 SwingUtilities2 类中的上述两个方法之一
如果您想要更进一步,您还可以考虑使用 Worker Threads。