Я работаю над физическим / игровым движком на 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();
}
Я поступаю неправильно?