smooth delta uses framerate-averaged instead of raw delta; stupid but works :\

This commit is contained in:
minjaesong
2019-01-20 21:46:11 +09:00
parent 09b4a34d14
commit 40580a57cd
3 changed files with 18 additions and 22 deletions

View File

@@ -41,6 +41,9 @@ class CircularArray<T>(val size: Int) {
//println("$this $unreliableAddCount")
}
fun getHeadElem(): T = buffer[head]
fun getTailElem(): T = buffer[tail]
/**
* Iterates the array with oldest element first.
*/

View File

@@ -25,7 +25,6 @@ import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
@@ -245,7 +244,7 @@ public class AppLoader implements ApplicationListener {
private final int _KALMAN_FRAMES_TO_DISCARD = 3;
private final double _KALMAN_UPDATE_THRE = 0.1;
private static final int _DELTA_ITER_AVR_SAMPLESIZE = 25;
private static final int _DELTA_ITER_AVR_SAMPLESIZE = 13;
private static CircularArray<Double> deltaHistory = new CircularArray<>(_DELTA_ITER_AVR_SAMPLESIZE);
private static double deltaAvr = 0.0;
@@ -255,14 +254,14 @@ public class AppLoader implements ApplicationListener {
*/
public static double getSmoothDelta() {
// kalman filter is calculated but not actually being used.
//return deltaAvr;
return deltaAvr;
// below is the kalman part
if (_kalman_discard_requested)
/*if (_kalman_discard_requested)
return Gdx.graphics.getRawDeltaTime();
return _kalman_xhat_k;
return _kalman_xhat_k;*/
}
public static void resetDeltaSmoothingHistory() {
@@ -287,6 +286,9 @@ public class AppLoader implements ApplicationListener {
// 2. everything is linear
// we may need to implement Extended Kalman Filter but wtf is Jacobian, I suck at maths.
//double observation = ((double) Gdx.graphics.getRawDeltaTime());
double observation = 1.0 / Gdx.graphics.getFramesPerSecond();
if (_kalman_discard_requested) {
_kalman_discard_frame_counter += 1;
if (_kalman_discard_frame_counter >= _KALMAN_FRAMES_TO_DISCARD) {
@@ -295,7 +297,7 @@ public class AppLoader implements ApplicationListener {
}
else {
// measurement value
double _kalman_zed_k = Gdx.graphics.getRawDeltaTime();
double _kalman_zed_k = observation;
if (_kalman_zed_k <= _KALMAN_UPDATE_THRE) {
// time update
@@ -314,19 +316,10 @@ public class AppLoader implements ApplicationListener {
// below is the averaging part
if (Gdx.graphics.getRawDeltaTime() <= _KALMAN_UPDATE_THRE) {
deltaHistory.add(((double) Gdx.graphics.getRawDeltaTime()));
ArrayList<Double> middleVals = new ArrayList<>();
deltaHistory.forEach((it) -> {
middleVals.add(it);
return null;
});
for (int k = deltaHistory.getElemCount() - 2; k >= 0; k--) {
for (int l = 0; l <= k; l++) {
middleVals.set(l, (middleVals.get(l) + middleVals.get(l + 1)) / 2.0);
}
}
deltaAvr = middleVals.get(0);
if (observation <= _KALMAN_UPDATE_THRE) {
deltaHistory.add(observation);
double deltaSum = deltaHistory.fold(0.0, (acc, val) -> { return acc += val; });
deltaAvr = deltaSum / deltaHistory.getElemCount();
}
}

View File

@@ -359,9 +359,9 @@ open class ActorWBMovable(renderOrder: RenderOrder, val immobileBody: Boolean =
override fun update(delta: Float) {
if (isUpdate && !flagDespawn) {
val ddelta = Gdx.graphics.rawDeltaTime.toDouble()
//val ddelta = AppLoader.getSmoothDelta()
//println("${Gdx.graphics.rawDeltaTime.toDouble()}\t${AppLoader.getSmoothDelta()}")
//val ddelta = Gdx.graphics.rawDeltaTime.toDouble()
val ddelta = AppLoader.getSmoothDelta()
println("${Gdx.graphics.rawDeltaTime.toDouble()}\t${AppLoader.getSmoothDelta()}")
if (!assertPrinted) assertInit()