Реализация дельты времени в lwjgl

Я работаю над физическим / игровым движком на Java и LWJGL. До этого момента я использовал Display.Sync(int), чтобы использовать постоянную частоту кадров и временную дельту 1 / int для обновлений физики. Я пытаюсь реализовать истинную дельту времени, чтобы полностью использовать вычислительную мощность. Ниже приведен класс, который я использую для отслеживания этой дельты:

package techwiz24.jVox2D.Physics;

public class PhysicsUtils {
    private static long lastTime = System.nanoTime();

    public static double getTimeDelta(){
        return (System.nanoTime()-lastTime)/1000000000d;
    }

    public static void updateDelta(){
        lastTime = System.nanoTime();
    }
}

На каждом тике движок циклически перебирает Physics Entities и применяет стандартную гравитацию и так далее, обновляя компоненты скорости и ускорения. Затем предполагается, что Движение будет применяться с использованием временной дельты. В конце цикла вызывается updateDelta(). Проблема в том, что это как-то заставляет все двигаться быстрее. Например, вот мой модуль движения:

package techwiz24.jVox2D.Physics;

/**
 * Moves an object in relation to it's velocity, acceleration, and time components
 * using the Kinematic equations.
 * @author techwiz24
 *
 */
public class PStandardMotion extends PhysicsEffect {

    @Override
    public String getName() {
        return "Standard Motion Effect";
    }

    @Override
    public String getVersion() {
        return "1";
    }

    /**
     * Using two Kinematic Equations, we can update velocity and location 
     * to simulate an earth-like gravity effect. This is called every tick,
     * and uses the TimeDelta stored in the physics object (Time since last update)
     * as the Time component. TODO: Figure out actual time deltas...
     * 
     * Note: This ignores wind resistance
     * 
     * Using: V_FINAL=V_INITIAL+at
     *        X=V_INITIAL*t + .5 * a * t^2
     * 
     * @param o The physics object to apply this to.
     */
    public void applyTo(PhysicsObject o) {

        double vf = o.getVelocityComponent()[1] + (o.getAccelerationComponent()[1]*o.timeDelta());
        double dy = o.getVelocityComponent()[1] + (0.5d * o.getAccelerationComponent()[1] * Math.pow(o.timeDelta(), 2));
        double dx = o.getVelocityComponent()[0] + (0.5d * o.getAccelerationComponent()[0] * Math.pow(o.timeDelta(), 2));

        o.updateVelocity(o.getVelocityComponent()[0], vf);
        o.updateLocation(o.getLocationComponent()[0]+dx, o.getLocationComponent()[1]+dy);

    }

}

timeDelta() просто возвращает текущую дельту времени.

public double timeDelta(){
        return PhysicsUtils.getTimeDelta();
}

Я поступаю неправильно?


person nlowe    schedule 16.09.2012    source источник