Java swing计时器循环变慢

Java swing计时器循环变慢,java,swing,timer,Java,Swing,Timer,所以,我试图用Java中的Swing创建一个小游戏。我创建的游戏循环使用javax.swing计时器。 该计时器(通常)每5毫秒调用一个循环 Timer tm = new Timer(5, this); tm.start(); @Override public void actionPerformed(ActionEvent e) { game.tick(); repaint(); revalidate(); } 我的代码可能相当繁重,因为它包含相当多的for循环,所

所以,我试图用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毫秒在一个循环中运行一次。 相反,它以相当稳定的每秒160帧的速度流动,至少在我的电脑上是这样。当我在我哥哥的电脑上尝试我的游戏(内存更少)时,它最初的运行速度是160fps,但大约2分钟后,帧数下降到稳定的60fps

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

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

您应该使用方法而不是构造函数参数

从文档(我的重点):

在固定速率执行中,每个执行都是相对于 初始执行的计划执行时间。如果执行失败 由于任何原因(如垃圾收集或其他背景)而延迟 活动),两次或两次以上的处决将快速连续发生 “追赶。”从长远来看,执行的频率将是 正好是指定周期的倒数(假设系统 时钟底层对象。等待(长)是准确的)


正如@hovercraftfullofels在评论中提到的,您应该在Swing事件线程上进行任何Swing调用。有关更多信息,请参阅。

尝试使用VisualVM评测应用程序(随JDK安装而来,至少是oracle的)。这应该告诉您哪些方法需要很长时间才能执行,以及需要多长时间。如果您使用Swing计时器,请确保测量实际的实时切片,并根据真实的时间切片进行物理计算,不是基于Swing计时器频率的估计时间,这保证不是非常准确。请添加适当的警告,如果他走这条路线,他必须注意在Swing事件线程上进行Swing调用,如果他不理解这条语句,那么他应该阅读解释它的文章。非常感谢。将java.util计时器与scheduleAtFixedRate一起使用就成功了!它有非常稳定的fps在任何上限我希望(甚至1000 fps)。标记为正确答案:)