如何在使用过多重绘时防止延迟
How to prevent latency while using too much repaint
我正在尝试制作一个小游戏,一架飞机升起,当我单击向下箭头时它会投下炸弹。如果炸弹击中目标,它会改变它的位置等...
public void paint(Graphics p) {
p.setColor(c);
p.drawLine(0, 650, 1000, 650);
p.fillRect(x3, y3, 150, 50);
p.fillOval(x2, y2, 30, 30);
p.drawImage(image, x, y, null);
if (x < 1000) {
x = x + 10;
}
if (x > 750) {
x = 0;
}
try {
Thread.sleep(40);
} catch (InterruptedException ignored) {
}
if (bo==true) {
x2 = x2 + z;
y2 = y2 + 8;
}
if (y2 > 450 && z != 0) {
z--;
}
if (y2 > 620) {
x2 =- 100;
y2 =- 100;
}
if (y2 > 610 && x2 < x3 + 150 && x2 > x3) {
x3 = x3 + 100;
}
repaint(1);
}
但问题是一开始一切正常,1 或 2 秒后 fps 就像 10,有时我看不到对象,我看到另一个关于使用计时器的主题,但我不想用计时器解决它,甚至我不知道我是否可以。我想知道是关于我的电脑还是 ide.
首先,不要Override
paint()
方法。 Override
paintComponent(Graphics g)
方法(不要忘记调用 super.paintComponent(g)
.
其次,在 EDT 中使用 Thread.sleep()
方法(希望您使用 SwingUtilities#invokeLater
启动您的应用程序)是个坏主意,因为所有事件都将停止发生(简单地说,整个 GUI会冻结)。
最后,不要在paintComponent
里面调用repaint()
,因为repaint()
会再次调用paintComponent
,死循环。您应该在 Timer 的动作侦听器中重新绘制组件。
我正在尝试制作一个小游戏,一架飞机升起,当我单击向下箭头时它会投下炸弹。如果炸弹击中目标,它会改变它的位置等...
public void paint(Graphics p) {
p.setColor(c);
p.drawLine(0, 650, 1000, 650);
p.fillRect(x3, y3, 150, 50);
p.fillOval(x2, y2, 30, 30);
p.drawImage(image, x, y, null);
if (x < 1000) {
x = x + 10;
}
if (x > 750) {
x = 0;
}
try {
Thread.sleep(40);
} catch (InterruptedException ignored) {
}
if (bo==true) {
x2 = x2 + z;
y2 = y2 + 8;
}
if (y2 > 450 && z != 0) {
z--;
}
if (y2 > 620) {
x2 =- 100;
y2 =- 100;
}
if (y2 > 610 && x2 < x3 + 150 && x2 > x3) {
x3 = x3 + 100;
}
repaint(1);
}
但问题是一开始一切正常,1 或 2 秒后 fps 就像 10,有时我看不到对象,我看到另一个关于使用计时器的主题,但我不想用计时器解决它,甚至我不知道我是否可以。我想知道是关于我的电脑还是 ide.
首先,不要Override
paint()
方法。 Override
paintComponent(Graphics g)
方法(不要忘记调用 super.paintComponent(g)
.
其次,在 EDT 中使用 Thread.sleep()
方法(希望您使用 SwingUtilities#invokeLater
启动您的应用程序)是个坏主意,因为所有事件都将停止发生(简单地说,整个 GUI会冻结)。
最后,不要在paintComponent
里面调用repaint()
,因为repaint()
会再次调用paintComponent
,死循环。您应该在 Timer 的动作侦听器中重新绘制组件。