【问题标题】:Java Delta Time causes jerky movementJava Delta Time 导致抖动
【发布时间】:2018-05-20 17:48:36
【问题描述】:

我正在尝试计算增量时间,以便在屏幕上平滑移动一个圆圈,无论帧速率如何。当我运行我的代码时,圆圈抖动,这意味着增量时间没有正确计算,但我在计算中找不到错误。这是代码

主类

import javax.swing.JFrame;

public class Main {

    public static long lastTime;
    public static double deltaTime;

    public static void main(String[] args) {
        lastTime = 0;

        //Setting up the JFrame
        JFrame frame = new JFrame("Test");
        frame.setSize(600, 400);
        frame.add(new PanelP());        
        frame.setVisible(true);

        //Loop
        while(true) {
            //Calculate DeltaTime
            deltaTime = (lastTime - (lastTime = System.nanoTime())) / -1000000.0;
            //Draw Frame
            frame.repaint();
        }
    }

}

还有面板类

import java.awt.Graphics;

import javax.swing.JPanel;

public class PanelP extends JPanel{

    private float x;

    public PanelP() {
        super();
    }

    @Override
    public void paintComponent(Graphics g) {

        //Move circle
        x += (10 * (float)Main.deltaTime);

        //Draw Circle
        g.drawOval(Math.round(x), 50, 30, 30);
    }
}

【问题讨论】:

  • 您可能应该测试deltaTime == 0,因为您第一次尝试该计算时将无法正确计算时间。
  • 我试过这个,但即使在第一次增量时间计算之后,仍然可以观察到抖动。
  • 一种绘画方法,仅供绘画使用。不要在绘画方法中更改类的属性。你应该有一个像 setOvalX(...) 这样的方法来设置你想要画圆的位置。您也不应该使用“while (true)”循环。对于动画,您应该使用 Swing Timer。你不应该重新粉刷框架。您只需要重新绘制面板,因为这是您自定义绘制代码的地方。
  • 好吧lastTime = 0; 可能是一个错误,所以我会修复它。您也在尽可能快地进行更新。我会使用 SwingTimer 甚至只是 Tread.sleep() 来减慢速度,以便屏幕有时间实际显示。每秒尝试 20 次以开始。
  • @markspace 谢谢,那行得通。如果您提交您的评论作为答案,我可以接受。

标签: java graphics jframe timedelta


【解决方案1】:
  1. lastTime = 0; 可能是一个错误,所以我会修复它。改为使用System.nanoTime() 对其进行初始化。

  2. 您也在尽可能快地进行更新。我会使用SwingTimer 甚至只是Tread.sleep() 来减慢速度,以便屏幕有时间实际显示。每秒尝试 20 次开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2021-06-22
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多