gpt4 book ai didi

Java:使用 Swing 编写游戏

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:10 25 4
gpt4 key购买 nike

我是游戏开发的新手。我已经开发游戏并研究游戏开发 2-3 个月了。我使用 Java。

我一直将 Swing 用于我的图形(也就是,整个游戏显示在 JPanel 上,使用 Graphics2D 对象)。到目前为止,我对此没有遇到任何问题。

最近,我在最近的项目中遇到了一个问题。某些方法在以一致的时间间隔调用时存在问题(有时它应该每 15-16 毫秒运行一次,但有时它开始每 3000 (!) 毫秒运行一次)。

我做了一些令人沮丧的调试和一些研究,发现发生这种情况的原因可能是因为我没有正确处理 Swing 和线程。

我的入口游戏循环在线程(不是 EDT)的 run() 方法中运行。所以我一直在 EDT 之外修改 Swing 元素。显然,这必然会引起问题。

当我发现这是问题所在时,我想:

“嘿,我将简单地使用 SwingUtilities.invokeLater() 来在 EDT 中运行游戏循环!”

但后来我想起来了,正如“禁止”在 EDT 之外操作 Swing 元素一样,操作非 Swing 对象也是有问题的来自 EDT 的内部(我认为...这是正确的吗?)。

如果是这样,那么我不知道如何使用 Swing 用 Ja​​va 开发游戏而不会遇到奇怪的问题

我的问题是:

如何使用 Swing 安全地开发游戏?为了避免涉及 Swing 和线程的问题,我应该严格遵守哪些好的准则?每个使用 Swing 的游戏开发者都应该知道的任何说明?

理解这一点对我来说非常重要,因为我真的很想使用 Java 进行游戏开发,但如果我不理解这一点,我总是会遇到奇怪的问题并且无法完成进步。

谢谢你的帮助

最佳答案

只要您不修改面板上绘制的图形以外的任何内容,您应该大部分时间都没有问题。就像一个非 EDT 线程在 大部分时间 工作一样。只要您不添加或删除任何 gui 元素,不调整任何东西的大小,不隐藏任何东西等,Swing 就不会摆弄其内部细节足以导致您的线程和 EDT 之间的竞争条件 - 大多数的时间。

即使用户在您的非 EDT 代码正在其上绘制时最小化面板也不会导致崩溃 - 面板可能会丢弃其旧的图形上下文并开始使用新的图形上下文,但旧的上下文将保持有效,直到您释放它(这与 C++ 不同,在 C++ 中,delete 会立即使对象无效,这会在不同的线程仍在使用本地指针时导致崩溃)。

问题是,如果您使用“我还没有看到出错的情况,它总是对我有用”的方法,那么您依赖于未定义的行为,并且您的代码可能会很快开始崩溃在更新 JVM 时。

你能做的最好的事情是在 EDT 线程上设置你的 GUI,在不同的线程上运行你的游戏逻辑,每 20 毫秒在面板上调用一次计时器 repaint()(或者无论你想要你的帧速率是什么)。然后,拥有一个包含显示当前游戏状态所需的一切的类对象。在 synchronized 代码块中,让面板的 paint() 生成自己的对象副本,并让 paint() 使用副本,同时主线程计算游戏需要的任何东西。当然,主线程应该使用相同的 synchronized 来写入类对象。这样,您就可以在线程之间获得最大可能的分离。

仅在 EDT 上运行整个游戏线程可能行不通,因为您的游戏执行的任何可能需要一段时间的操作都会导致 UI 卡住。任何需要大量 UI 资源的东西都会影响您的游戏逻辑。

顺便说一句,您确定您最初的问题(时不时地延迟很长时间,但并非总是如此)不是垃圾回收的结果吗?我已经看过好几次了;如果您不使用并行垃圾收集器,GC 可能会运行几十秒并阻塞其他一切。

关于Java:使用 Swing 编写游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21649280/

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