我正在测试Java中的基本球碰撞。我在JPanel上画画。所有球都存储在ArrayList中。当球的数量很少时,没有问题。但如果球的数量不高,则gui开始滞后。我正在使用双缓冲。我的代码结构是:
class DrawingPanel extends JPanel{
BufferedImage bi; //offscreen drawing on this image
/*constructor......end of constructor*/
@Override
public void paintComponent(Graphics g)
{
g.drawImage(bi,0,0);
}
//Method draw() for drawing on buffered image
public void draw()
{
/*
lots of drawing on buffered image
takes about 2-3-4 millliseconds
*/
//now draw this buffered image
this.repaint();
}
我有一个ThreadUpdater线程,用于更新碰撞物理并调用draw() :
public class AnimationUpdater extends Thread{
final DrawingPanel panel;
/*inititializations and various code*/
//run
@Override
public void run()
{
long interval; /*calculate and store time taken in processing physics and drawing. This is also the time which is used in equations.*/
while(true)
{
updatePhysics();
panel.draw();
Thread.sleep(6); //slow things down
}
}} 上述方案的问题是调用draw方法不在EventThread中,因此使屏幕闪烁。随着球的数量增加并因此帧速率下降,在每个互动步骤之间处理所花费的总时间减少。但是,如果我在另一个线程中将其称为:
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
panel.draw();
}
});
适用于较少的球但随着球的数量增加,GUI在固定的时间间隔后开始滞后。由于在不同线程中执行,因此不会消耗绘图操作中的时间(2-3-4秒时间),因此帧速率也不会下降。 我该如何解决这个问题。请帮忙。