如何修复Java中的动画滞后?

时间:2014-05-16 17:54:22

标签: java swing

我正在尝试使用下面的代码在 JComponent 的子类中使用Java编写动画,但是此代码会导致动画中出现滞后和抖动,并且对象看起来像是“分裂”的在屏幕上快速重绘。我该如何解决这个问题?我应该在单独的线程上重绘每个项目吗?

public GameScene(){
   setDoubleBuffered(true);
   run();
}

...
public void run() {
    Thread animation = new Thread(new Runnable() {
        public void run() {
            updateGraphics();
        }
    });

    animation.start();
}

public void updateGraphics() {
    while (true) {
        repaint();

        try {
            Thread.sleep(5);
        } catch (Exception ex) {

        }
    }
}

2 个答案:

答案 0 :(得分:3)

而不是使用Java Timer尝试使用更适合Swing应用程序的Swing Timer

请查看How to Use Swing Timers

以下是示例代码:

int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
      //...Perform a task...
  }
};
new Timer(delay, taskPerformer).start();

找到Sample code here

enter image description here

答案 1 :(得分:2)

你很模糊地描述你的问题。

原则上,Swing并不是非常适合动画 - 速度不是主要问题 - 而是缺乏控制何时在屏幕上更新图形的可能性。

Swing不会将渲染与屏幕刷新同步。虽然它确实是双缓冲区(默认情况下),但是在显示屏幕时刷新图形仍然会发生(并且确实如此),在组件框架N的上半部分显示(例如),而框架N + 1在下半部分(因为帧更新发生在屏幕刷新位于屏幕中间的某个位置时)。

我所知道的唯一解决方案是切换到全屏模式(http://docs.oracle.com/javase/tutorial/extra/fullscreen/),其中渲染可以是光束同步的。窗口显示没有解决方案(据我所知)。