Java 如何使时间独立于FPS?

Java 如何使时间独立于FPS?,java,physics,frame-rate,Java,Physics,Frame Rate,我有一个程序,每帧运行tick()方法。我想让一个物体根据设定的重力常数下落,所以我创建了一个球物体,它将把它的位置更新为前一帧上的位置减去y速度。y速度将随着每个刻度的重力常数而减小。但是下降的速度太快了,因为滴答声不能直接转化为秒。我想我遗漏了一些基本的数学知识,但是我处理了太多的变量,我看不出它是什么 编辑:添加了代码 @Override public void run(){ init(); long lastTime=System.nanoTime(), timer=S

我有一个程序,每帧运行
tick()
方法。我想让一个物体根据设定的重力常数下落,所以我创建了一个
物体,它将把它的位置更新为前一帧上的位置减去y速度。y速度将随着每个刻度的重力常数而减小。但是下降的速度太快了,因为滴答声不能直接转化为秒。我想我遗漏了一些基本的数学知识,但是我处理了太多的变量,我看不出它是什么

编辑:添加了代码

@Override
public void run(){
    init();

    long lastTime=System.nanoTime(), timer=System.currentTimeMillis();
    final double ticks=60.0;
    double ns=1000000000/ticks, delta=0;
    int updates=0, frames=0;

    while(running){
        long now=System.nanoTime();
        delta+=(now-lastTime)/ns;
        lastTime=now;

        if(delta>=1){
            tick();
            updates++;
            delta--;
        }

        render();
        frames++;

        if((System.currentTimeMillis()-timer)>1000){
             timer+=1000;
             System.out.println(updates+" ticks, FPS "+frames);
             frame.setTitle("Ball -- "+SCALEWIDTH+"x"+SCALEHEIGHT+" at "+frames+" FPS");
             updates=0;
             frames=0;
        }
    }
    stop();
}

对于每个更新帧,您需要计算从现在到上一次更新之间的时间(以秒为单位)。这将需要一个浮点或双精度,因为它可能只需要几分之一秒。为此,以毫秒或纳秒为单位获取当前时间,减去之前的时间,然后转换为秒

然后,您可以使用名为数值积分的过程来计算新的位置和速度。这意味着通过基于前一帧的计算和它们之间的时间计算当前帧中的位置和速度,找到运动方程的近似值。这看起来像:

position += velocity * dt;
velocity += acceleration * dt;
其中,
dt
是帧之间的时间,单位为秒。这种积分位置和速度的特殊方法称为欧拉方法。这种方法很简单,可能适合您的应用程序,但随着时间的推移,当速度或加速度不恒定时,它开始变得不准确。这是因为正在计算的值是曲线的近似值


如果您需要更高的精度,您需要研究其他集成方法,如VerletRunge Kutta

对于每个更新帧,您需要计算从现在到上一次更新之间的时间(以秒为单位)。这将需要一个浮点或双精度,因为它可能只需要几分之一秒。为此,以毫秒或纳秒为单位获取当前时间,减去之前的时间,然后转换为秒

然后,您可以使用名为数值积分的过程来计算新的位置和速度。这意味着通过基于前一帧的计算和它们之间的时间计算当前帧中的位置和速度,找到运动方程的近似值。这看起来像:

position += velocity * dt;
velocity += acceleration * dt;
其中,
dt
是帧之间的时间,单位为秒。这种积分位置和速度的特殊方法称为欧拉方法。这种方法很简单,可能适合您的应用程序,但随着时间的推移,当速度或加速度不恒定时,它开始变得不准确。这是因为正在计算的值是曲线的近似值


如果您需要更高的精度,您需要研究其他集成方法,如VerletRunge Kutta

对于每个更新帧,您需要计算从现在到上一次更新之间的时间(以秒为单位)。这将需要一个浮点或双精度,因为它可能只需要几分之一秒。为此,以毫秒或纳秒为单位获取当前时间,减去之前的时间,然后转换为秒

然后,您可以使用名为数值积分的过程来计算新的位置和速度。这意味着通过基于前一帧的计算和它们之间的时间计算当前帧中的位置和速度,找到运动方程的近似值。这看起来像:

position += velocity * dt;
velocity += acceleration * dt;
其中,
dt
是帧之间的时间,单位为秒。这种积分位置和速度的特殊方法称为欧拉方法。这种方法很简单,可能适合您的应用程序,但随着时间的推移,当速度或加速度不恒定时,它开始变得不准确。这是因为正在计算的值是曲线的近似值


如果您需要更高的精度,您需要研究其他集成方法,如VerletRunge Kutta

对于每个更新帧,您需要计算从现在到上一次更新之间的时间(以秒为单位)。这将需要一个浮点或双精度,因为它可能只需要几分之一秒。为此,以毫秒或纳秒为单位获取当前时间,减去之前的时间,然后转换为秒

然后,您可以使用名为数值积分的过程来计算新的位置和速度。这意味着通过基于前一帧的计算和它们之间的时间计算当前帧中的位置和速度,找到运动方程的近似值。这看起来像:

position += velocity * dt;
velocity += acceleration * dt;
其中,
dt
是帧之间的时间,单位为秒。这种积分位置和速度的特殊方法称为欧拉方法。这种方法很简单,可能适合您的应用程序,但随着时间的推移,当速度或加速度不恒定时,它开始变得不准确。这是因为正在计算的值是曲线的近似值


如果您需要更高的精度,您将需要研究其他集成方法,如VerletRunge Kutta

您的
tick()
函数可以返回时间增量(自上次tick以来经过的时间量)。然后你可以用它来计算新的y速度,我想我需要重新分析这个程序。它是根据教程修改的。一般来说,我应该寻找什么?将帧速率除以刻度之间的时间以获得“实时”?对于Java,您不需要除以任何东西。您只需调用
System.nanotime()
并使用差异来确定多少