diff --git a/src/net/torvald/dataclass/CircularArray.kt b/src/net/torvald/dataclass/CircularArray.kt index 57a99f75d..1f0234fee 100644 --- a/src/net/torvald/dataclass/CircularArray.kt +++ b/src/net/torvald/dataclass/CircularArray.kt @@ -41,6 +41,9 @@ class CircularArray(val size: Int) { //println("$this $unreliableAddCount") } + fun getHeadElem(): T = buffer[head] + fun getTailElem(): T = buffer[tail] + /** * Iterates the array with oldest element first. */ diff --git a/src/net/torvald/terrarum/AppLoader.java b/src/net/torvald/terrarum/AppLoader.java index 2e13e6d4b..c3ad010b4 100644 --- a/src/net/torvald/terrarum/AppLoader.java +++ b/src/net/torvald/terrarum/AppLoader.java @@ -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 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 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(); } } diff --git a/src/net/torvald/terrarum/gameactors/ActorWBMovable.kt b/src/net/torvald/terrarum/gameactors/ActorWBMovable.kt index 8b946bacb..604528c9b 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWBMovable.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWBMovable.kt @@ -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()