我有一个带有switch语句的while循环:
while(true) {
switch(state) {
case LOADING :
//THIS IS THE IMPORTANT PART
//view loading screen (already set by default)
contentPane.repaint();
if(tick == 400000) {
//state = GameState.MENU;
System.out.println("Reached " + gameTick);
}
break;
case MENU :
//view menu
break;
//some other cases without content, left them out here
}
tick++;
if(tick < 400000) {
System.out.println(tick);
}
if(tick == Long.MAX_VALUE) {
tick = 0;
}
}
现在这个代码执行得很好,它显示了加载屏幕(只要重复调用它就会重复调用它的移动点,所以我确切知道它何时停止),输出计数从1到400000并且在那个号码打印
399998
399999
Reached 400000
(最后3行输出)
应用程序全屏显示,当我alt + tab out时,计数器通常在130K左右,我看它移动到400K。
但是,如果我删除了打印此数字的if语句:
if(tick < 400000) {
System.out.println(tick);
}
加载屏幕永远不会移动,当我alt + tab out时,400K已经到达。
同样奇怪的是,加载屏幕有三个'外观变化',一个是100个调用它的paintComponent方法,一个是200个调用,一个是300个调用,它将计数器重置为0.所以基本上,每100个滴答它是应该改变外观。在第一种情况下,使用if语句,执行时间较长,我看到了更改,但到目前为止并没有像我期望的那样频繁。在第二种情况下,我根本看不到它们(我可以想象它们会发生得太快)。
所以我的问题是,是什么造成了执行时间的这个相当大的差异,是什么导致了paintComponent方法似乎被调用的次数的差异,以及循环迭代的400.000倍?
所有想法都被接受了。
答案 0 :(得分:5)
写入控制台,尤其是MS-DOS控制台,速度非常慢。您应该尽量将写入控制台的行数保持在最低限度。如果你必须编写大量数据,我建议你把它写入文件,因为它可以明显更快。
我认为这是在另一个线程中完成的,而你并没有占用GUI线程。
答案 1 :(得分:2)
repaint()
方法不会立即重新绘制组件,只是通知AWT / Swing系统重新绘制组件。因此,如果您快速拨打repaint()
10次,则很有可能只会重新粉刷一次。
现在,如果你看一下你的循环,它就不会做任何需要很长时间的事情(注意repaint()
没有重新绘制)。如果你在循环中添加System.out.println()
调用,它将显着增加你在循环中完成的工作。
答案 2 :(得分:1)
写入控制台是一项相对耗时的任务,特别是与什么都不做相比。这大大减慢了执行速度。如果将输出重定向到文件,则循环将比没有打印时慢,但比打印到控制台更快。
这是造成打印和不打印时执行速度差异的原因。
答案 3 :(得分:1)
尝试类似的事情,
tick++;
Thread.sleep(100);
并检查您所谓的更改是否正在发生。
答案 4 :(得分:1)
任何类型的界面比没有它的情况下慢很多倍。无论是控制台还是图形界面。这主要是因为访问图形设备所需的所有额外代码。更不用说硬件延迟了。