我正在制作游戏,它有一个主要重复调用游戏更新功能并调用组件重绘功能的线程(见下文)。
public void run()
{
try {
while(true)
{
b.infps++; //b is the JComponent that draws the game and also passes on the game's update steps
long start = System.currentTimeMillis();
if(start >= b.lastSec + 1000)
{
b.fps = b.infps;
b.infps = 0;
b.lastSec = start;
}
lastMil = start;
if(!b.paused || b.step) //paused is when the game is paused, and step allows the game to update one frame at a time by keypress (for debugging)
{
b.update();
b.step = false;
}
else
b.updateWhilePaused();
System.out.println("Running at "+Math.min(desired, Math.max(1, desired + start - finish)));
b.repaint();
long finish = System.currentTimeMillis();
Thread.sleep(Math.min(desired, Math.max(1, desired + start - finish)));
}
} catch (InterruptedException e) {
}
}
这已经工作了一年多了,但突然之间,我遇到了这个错误,看起来似乎整个事情都冻结了,没有再重新粉刷,也没有更多的用户互动(甚至无法关闭使用Alt + F4或按下红色X)的窗口。
起初我认为这是我创建的一些无限循环,但是当我检查时,线程仍然运行正常且花花公子,并且每隔24毫秒调用update和repaint(System.out.println仍然重复发布到eclipse的控制台)。
使用Java VisualVM工具,我尝试分析变化,我唯一能识别的是AWT-EventQueue-0在运行和等待之间停止交替,并开始不断运行。
为了绘制我的游戏,我已经覆盖了“b”的paintComponent方法,并且我已经确定不再调用它,即使b.repaint()是。我还检查过它确保它仍然在JFrame的组件层次结构中。 (我打印出b.getParentComponent()直到它到达JFrame,并且没有任何变化)。
所以我对这里发生的事情感到困惑。