所以,我试图用Java中的Swing创建一个小游戏。我创建的游戏循环使用了一个javax.swing Timer。 此计时器(通常)每5ms调用一次循环。
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
答案 0 :(得分:3)
您应该使用Timer.scheduleAtFixedRate
方法而不是构造函数参数。
从文档(强调我的):
在固定费率执行中,每次执行都是相对于 初始执行的预定执行时间。如果执行是 因任何原因而延迟(例如垃圾收集或其他背景 活动),两个或多个执行将快速连续发生 “跟上来。” 从长远来看,执行的频率将是 恰好是指定时期的倒数(假设系统 Object.wait(long)的时钟是准确的。)
正如@HovercraftFullOfEels的评论中所提到的,你应该在Swing Event Thread上进行任何Swing调用。有关详细信息,请参阅this tutorial。