From 93af194c8abb6eb65c47991fa2140b868ce22c1a Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 15 Oct 2022 01:09:51 +0900 Subject: [PATCH] rudimentary framerate benchmarking (turning it on will make the game run significantly slower) --- src/net/torvald/terrarum/DefaultConfig.kt | 2 ++ src/net/torvald/terrarum/IngameInstance.kt | 3 +++ src/net/torvald/terrarum/Terrarum.kt | 6 ++--- .../torvald/terrarum/TerrarumPostProcessor.kt | 22 +++++++++++++++++++ .../terrarum/modulebasegame/TerrarumIngame.kt | 6 ++++- src/net/torvald/util/CircularArray.kt | 9 ++++++++ 6 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/net/torvald/terrarum/DefaultConfig.kt b/src/net/torvald/terrarum/DefaultConfig.kt index 00b2ad739..37509cb4c 100644 --- a/src/net/torvald/terrarum/DefaultConfig.kt +++ b/src/net/torvald/terrarum/DefaultConfig.kt @@ -112,6 +112,8 @@ object DefaultConfig { "fx_newlight" to false, + "debug_key_deltat_benchmark" to Input.Keys.SLASH + // settings regarding debugger diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 9d0b125d3..3aedf5c27 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -19,6 +19,7 @@ import net.torvald.terrarum.modulebasegame.ui.UITooltip import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.savegame.VirtualDisk import net.torvald.terrarum.ui.ConsoleWindow +import net.torvald.util.CircularArray import net.torvald.util.SortedArrayList import org.khelekore.prtree.* import java.io.File @@ -78,6 +79,8 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo open var uiTooltip: UITooltip = UITooltip() open var notifier: Notification = Notification() + val deltaTeeBenchmarks = CircularArray(1024, true) + init { consoleHandler.setPosition(0, 0) notifier.setPosition( diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 1a8f5c6e8..d706e4e40 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -12,7 +12,6 @@ import com.badlogic.gdx.graphics.glutils.ShapeRenderer import com.badlogic.gdx.utils.Disposable import com.badlogic.gdx.utils.JsonReader import com.jme3.math.FastMath -import net.torvald.unsafe.UnsafeHelper import net.torvald.gdx.graphics.Cvec import net.torvald.random.HQRNG import net.torvald.terrarum.App.* @@ -33,6 +32,7 @@ import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap +import net.torvald.unsafe.UnsafeHelper import net.torvald.util.CircularArray import java.io.File import java.io.PrintStream @@ -114,7 +114,7 @@ object Terrarum : Disposable { private val javaHeapCircularArray = CircularArray(64, true) private val nativeHeapCircularArray = CircularArray(64, true) - private val updateRateCircularArray = CircularArray(16, true) + private val updateRateCircularArray = CircularArray(64, true) val memJavaHeap: Int get() { @@ -133,7 +133,7 @@ object Terrarum : Disposable { val updateRateStr: String get() { updateRateCircularArray.appendHead(updateRate) - return String.format("%.2f", updateRateCircularArray.maxOrNull() ?: 0.0) + return String.format("%.2f", updateRateCircularArray.average()) } lateinit var testTexture: Texture diff --git a/src/net/torvald/terrarum/TerrarumPostProcessor.kt b/src/net/torvald/terrarum/TerrarumPostProcessor.kt index decf77b07..5f571d415 100644 --- a/src/net/torvald/terrarum/TerrarumPostProcessor.kt +++ b/src/net/torvald/terrarum/TerrarumPostProcessor.kt @@ -153,6 +153,26 @@ object TerrarumPostProcessor : Disposable { App.fontGame.draw(it, thisIsDebugStr, 5f, App.scr.height - 24f) } } + + if (KeyToggler.isOn(App.getConfigInt("debug_key_deltat_benchmark"))) { + batch.color = Toolkit.Theme.COL_ACTIVE + batch.inUse { + // we're going to assume the data are normally distributed + val benchstr = if (INGAME.deltaTeeBenchmarks.elemCount < INGAME.deltaTeeBenchmarks.size) { + "ΔF: Gathering data (${INGAME.deltaTeeBenchmarks.elemCount}/${INGAME.deltaTeeBenchmarks.size})" + } + else { + val tallies = INGAME.deltaTeeBenchmarks.toList() + val average = tallies.average() + val stdev = (tallies.sumOf { (it - average).sqr() } / tallies.size).sqrt() + val low5 = average + stdev * -1.64 + val low1 = average + stdev * -2.33 + "ΔF: Avr ${average.format(1)}; 95% ${low5.format(1)}; 99% ${low1.format(1)}; σ ${stdev.format(1)}" + } + val tw = App.fontGame.getWidth(benchstr) + App.fontGame.draw(it, benchstr, Toolkit.drawWidth - tw - 5f, App.scr.height - 24f) + } + } } } @@ -160,6 +180,8 @@ object TerrarumPostProcessor : Disposable { } private val rng = HQRNG() + private fun Double.format(digits: Int) = "%.${digits}f".format(this) + private val swizzler = intArrayOf( 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 1,0,0,0, 0,1,0,0, 0,0,0,1, 0,0,1,0, diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index e7d1ae8f3..e7bdae3c8 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -581,7 +581,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { // some sketchy test code here - + KeyToggler.forceSet(App.getConfigInt("debug_key_deltat_benchmark"), false) }// END enter @@ -819,6 +819,10 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { WORLD_UPDATE_TIMER += 1 + + if (KeyToggler.isOn(App.getConfigInt("debug_key_deltat_benchmark"))) { + deltaTeeBenchmarks.appendHead(1f / Gdx.graphics.deltaTime) + } } diff --git a/src/net/torvald/util/CircularArray.kt b/src/net/torvald/util/CircularArray.kt index 6c6f0add6..eebd3d316 100644 --- a/src/net/torvald/util/CircularArray.kt +++ b/src/net/torvald/util/CircularArray.kt @@ -80,6 +80,9 @@ class CircularArray(val size: Int, val overwriteOnOverflow: Boolean): Iterabl } } + /** + * To just casually add items to the list, use [appendHead], **please!** + */ fun appendTail(item: T) { // even if overflowing is enabled, appending at tail causes head element to be altered, therefore such action // must be blocked by throwing overflow error @@ -183,6 +186,12 @@ class CircularArray(val size: Int, val overwriteOnOverflow: Boolean): Iterabl return accumulator } + fun toList(): List { + val list = ArrayList() + iterator().forEach { list.add(it) } + return list.toList() + } + private inline fun Int.wrap() = this fmod size override fun toString(): String {