【问题标题】:How to fix animation lags in Java?如何修复 Java 中的动画滞后?
【发布时间】:2014-05-16 17:54:21
【问题描述】:

我正在尝试使用 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) {

        }
    }
}

【问题讨论】:

  • 请分享最少的可测试代码。
  • @Braj 好吧,我在paintComponent 方法中拥有的只是改变对象位置然后重绘它们的标准代码。没有什么特别的。我觉得我上面贴的代码很脆弱,可能有问题。代码是靠系统来记录时间的,而系统似乎并不能很好地计算 5 毫秒。有没有更好的调用 repaint() 方法的方法?
  • 只用 5 毫秒调用 Thread.sleep() 的原因是什么?
  • @Miller 5 毫秒似乎是系统在重新绘制场景之前等待的可接受时间。使用这段时间时,动画看起来很逼真。

标签: java swing


【解决方案1】:

不要使用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

【讨论】:

    【解决方案2】:

    您对问题的描述非常含糊。

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 1970-01-01
      • 2019-03-11
      • 2016-09-22
      • 1970-01-01
      • 2015-04-13
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多