From 7fcda64a8dd5cd5e8aa8943beeec51b9ef1ff637 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 11 May 2022 20:26:23 +0200 Subject: [PATCH] improve palette performance, improve hud performance --- .../palette/data/ArrayPaletteData.kt | 19 ++++++++----------- .../gui/rendering/gui/hud/HUDManager.kt | 13 +++++++++---- .../elements/other/BreakProgressHUDElement.kt | 3 ++- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/world/container/palette/data/ArrayPaletteData.kt b/src/main/java/de/bixilon/minosoft/data/world/container/palette/data/ArrayPaletteData.kt index aac13ec45..a3c54d508 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/container/palette/data/ArrayPaletteData.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/container/palette/data/ArrayPaletteData.kt @@ -21,6 +21,8 @@ class ArrayPaletteData( val elementBits: Int, override val size: Int, ) : PaletteData { + private val singleValueMask = (1 shl elementBits) - 1 + private val valuesPerLong = Long.SIZE_BITS / elementBits private lateinit var data: LongArray init { @@ -34,17 +36,14 @@ class ArrayPaletteData( (bits + (Long.SIZE_BITS - 1)) / Long.SIZE_BITS // divide up } else { - val elementsPerLong = Long.SIZE_BITS / elementBits - (size + elementsPerLong - 1) / elementsPerLong + (size + valuesPerLong - 1) / valuesPerLong } data = buffer.readLongArray(longs) } override operator fun get(index: Int): Int { - val individualValueMask = (1 shl elementBits) - 1 - - var blockId: Long = if (versionId < LONG_BIT_SPLITTING_VERSION) { - val startLong = index * elementBits / Long.SIZE_BITS + val blockId: Long = if (versionId < LONG_BIT_SPLITTING_VERSION) { + val startLong = index * valuesPerLong val startOffset = index * elementBits % Long.SIZE_BITS val endLong = ((index + 1) * elementBits - 1) / Long.SIZE_BITS @@ -55,14 +54,12 @@ class ArrayPaletteData( data[startLong] ushr startOffset or (data[endLong] shl endOffset) } } else { - val startLong = index / (Long.SIZE_BITS / elementBits) - val startOffset = index % (Long.SIZE_BITS / elementBits) * elementBits + val startLong = index / valuesPerLong + val startOffset = index % valuesPerLong * elementBits data[startLong] ushr startOffset } - blockId = blockId and individualValueMask.toLong() - - return blockId.toInt() + return blockId.toInt() and singleValueMask } companion object { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDManager.kt index dc26b6b25..cff4c5d36 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDManager.kt @@ -14,8 +14,9 @@ package de.bixilon.minosoft.gui.rendering.gui.hud import de.bixilon.kutil.cast.CastUtil.unsafeCast -import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf +import de.bixilon.kutil.collections.CollectionUtil.lockMapOf import de.bixilon.kutil.collections.CollectionUtil.toSynchronizedMap +import de.bixilon.kutil.collections.map.LockMap import de.bixilon.minosoft.config.key.KeyActions import de.bixilon.minosoft.config.key.KeyBinding import de.bixilon.minosoft.config.key.KeyCodes @@ -41,7 +42,7 @@ class HUDManager( ) : GUIElementDrawer, Initializable { val renderWindow = guiRenderer.renderWindow - private val hudElements: MutableMap = synchronizedMapOf() + private val hudElements: LockMap = lockMapOf() override var lastTickTime = 0L @@ -72,12 +73,14 @@ class HUDManager( } fun onMatrixChange() { - for (element in hudElements.toSynchronizedMap().values) { + hudElements.lock.acquire() + for (element in hudElements.values) { if (element is LayoutedGUIElement<*>) { element.element.forceApply() } element.apply() } + hudElements.lock.release() } override fun init() { @@ -104,7 +107,9 @@ class HUDManager( } fun draw() { - drawElements(hudElements.toSynchronizedMap().values) + hudElements.lock.acquire() + drawElements(hudElements.values) + hudElements.lock.release() } operator fun get(hudBuilder: HUDBuilder): T? { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt index e1d89340d..990268393 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.other import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.text.ChatColors +import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer import de.bixilon.minosoft.gui.rendering.gui.elements.Element @@ -41,7 +42,7 @@ class BreakProgressHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), override fun draw() { val breakProgress = breakInteractionHandler.breakProgress if (breakProgress <= 0 || breakProgress >= 1.0) { - textElement.text = "" + textElement.text = ChatComponent.EMPTY this.percent = -1 return }