【问题标题】:Java swing Timer loop slows downJava swing Timer循环变慢
【发布时间】:2015-06-08 20:21:10
【问题描述】:

所以,我正在尝试使用 Java 中的 Swing 创建一个小游戏。我创建的游戏循环使用 javax.swing 计时器。 这个计时器(通常)每 5 毫秒调用一次循环。

Timer tm = new Timer(5, this);
tm.start();

@Override
public void actionPerformed(ActionEvent e) {
    game.tick();
    repaint();
    revalidate();
}

我的代码可能非常繁重,因为它包含很多 for 循环,所以我并不奇怪这实际上不是每 5 毫秒运行一次循环。 相反,它以相当稳定的 160fps 流动,至少在我的电脑上是这样。当我在我兄弟的电脑上尝试我的游戏时(更少的 RAM),它一开始以相同的 160fps 运行,但大约 2 分钟后,帧数下降到稳定的 60fps。

我个人觉得很奇怪,帧在同一时间间隔内下降这么多,并且在其余时间保持稳定。

如果有人遇到类似问题并且知道是什么原因造成的,请告诉我。提前致谢。 〜Krikke

【问题讨论】:

  • 尝试使用 VisualVM 分析您的应用程序(至少在安装 JDK 时附带)。这应该告诉您哪些方法需要很长时间才能执行,以及需要多长时间。
  • 如果您使用摇摆定时器,请务必测量实际的实时时间片,并将您的物理基于真实的时间片,不是基于摇摆定时器的估计时间频率保证不是很准确。

标签: java swing timer


【解决方案1】:

您应该使用Timer.scheduleAtFixedRate 方法而不是构造函数参数。

来自文档(重点是我的):

在固定速率执行中,每次执行都是相对于 初始执​​行的预定执行时间。如果执行是 因任何原因延迟(例如垃圾收集或其他背景 活动),两个或多个处决将快速连续发生 “跟上来。” 从长远来看,执行频率将是 正好是指定周期的倒数(假设系统 底层 Object.wait(long) 的时钟是准确的)。

正如@HovercraftFullOfEels 在 cmets 中提到的,您应该在 Swing 事件线程上进行任何 Swing 调用。如需更多信息,请参阅this tutorial

【讨论】:

  • 请添加适当的警告,如果他走这条路线,他必须小心在 Swing 事件线程上进行 Swing 调用,如果他不理解这句话,那么他应该阅读Concurrency in Swing 解释它的文章。
  • 非常感谢。使用带有 scheduleAtFixedRate 的 java.util 计时器就可以了!在我希望的任何上限(甚至 1000 fps)下,它都具有非常稳定的 fps。标记为正确答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多