摇摆JUI闪烁与滞后?

时间:2013-12-07 22:17:04

标签: java swing paint simulation game-physics

我正在测试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秒时间),因此帧速率也不会下降。 我该如何解决这个问题。请帮忙。

0 个答案:

没有答案