Gor*_*les 4 java swing multithreading event-dispatch-thread
在这种情况下,上下文是创建一个与模型集成的游戏循环,并每帧更新一次视图。听众与控制器接口,控制器更新模型,repaint()处理来自模型视图更新(上覆盖paintComponent()上一JPanel)。
合适的答案包括“从不”,哈哈。
这个问题我认为有一个更好的答案,所以它不应该违反规则。
我问这个是因为主游戏循环是一个Runnable我锁定到 60FPS的实例(目前大致上。几毫秒的差异,因为当前的渲染循环非常便宜,并且 1000 / 60 每个循环损失一两毫秒)。不通过锁定帧速率Thread.sleep()会导致每秒23亿帧(显然),这可以理解地使我的 CPU 崩溃。不是问题说起来,更多的是为什么需要帧锁定的例子。
然而,在我遇到的每一个答案、每一条评论中,他们中的大多数人都说“为什么你甚至Thread.sleep()不想让 EDT 睡觉”。如果您的循环中存在导致无响应的缺陷,这是可以理解的,但在我尚未组装的应用程序中,情况并非如此。我已经阅读了所有相关的事件调度线程文档,如何使用 Swing 计时器等。我什至自己也使用过计时器,还有 SwingWorkers(在一种情况下,将图标加载委托给后台以防止 GUI 实例化时出现阻塞) .
这里甚至有首选方法吗?我还没有遇到过很多/任何不依赖于 libgdx 的 Java 独立游戏解决方案。
Timer:您不想节流或控制更新之间的时间。SwingTimer仅保证“至少”持续时间(它将在给定延迟后触发),并且处理事件的时间长度可能会影响下次更新之前的时间量。
所以,如果你有 16ms 的延迟(大约 60fps),你的回调需要 20ms 来处理,第一次和第二次回调之间的时间实际上可能是 36ms
Timer当您想要使用 Swing 提供的现有(被动)渲染系统时,您还可以使用Swing
SwingTimer相对简单易用,它在 Event Dispatching Thread 内触发回调,可以轻松修改游戏状态和安排 UI 更新,这减少了可能的线程竞争条件(在绘制和更新之间)
Thread#sleep在以下情况下使用:您想要更多地控制时序,从而产生可变延迟。为此,您需要管理自己的Thread
这种方法更适合更复杂的动画以及当您使用 aBufferStrategy来控制输出时。
这样做的原因是,通过一种Thread方法,您可能会在线程更改状态和绘制周期绘制状态之间存在竞争条件的风险。相反,您需要自己控制绘制过程,因此您知道在绘制某些东西时,状态不会在您进行绘制时发生变化。
使用这种方法可以提供更多的灵活性和控制来决定事情何时完成(以及如何完成),但会增加复杂性和你做事的责任