From 8caf3de634984cbc5c7ac5e25f368877321a334e Mon Sep 17 00:00:00 2001 From: Kenneth Endfinger Date: Sat, 8 Jan 2022 15:04:16 -0500 Subject: [PATCH] Gjallarhorn: Implement block state global cache. This reduces memory usage by reusing block state objects. --- .../foundation/gjallarhorn/state/BlockChangelog.kt | 4 ++-- .../foundation/gjallarhorn/state/BlockState.kt | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/state/BlockChangelog.kt b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/state/BlockChangelog.kt index d076991..3f9d259 100644 --- a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/state/BlockChangelog.kt +++ b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/state/BlockChangelog.kt @@ -29,7 +29,7 @@ class BlockChangelog( val location = BlockCoordinate(x.toLong(), y.toLong(), z.toLong()) val fromBlock = if (changeIsBreak) { - BlockState(block) + BlockState.cached(block) } else { BlockState.AirBlock } @@ -37,7 +37,7 @@ class BlockChangelog( val toBlock = if (changeIsBreak) { BlockState.AirBlock } else { - BlockState(block) + BlockState.cached(block) } BlockChange( diff --git a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/state/BlockState.kt b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/state/BlockState.kt index 48ff7b2..78a20e0 100644 --- a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/state/BlockState.kt +++ b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/state/BlockState.kt @@ -1,10 +1,13 @@ package cloud.kubelet.foundation.gjallarhorn.state -import kotlinx.serialization.Serializable +import java.util.concurrent.ConcurrentHashMap -@Serializable -data class BlockState(val type: String) { +class BlockState(val type: String) { companion object { - val AirBlock = BlockState("minecraft:air") + private val cache = ConcurrentHashMap() + + val AirBlock: BlockState = cached("minecraft:air") + + fun cached(type: String): BlockState = cache.computeIfAbsent(type) { BlockState(type) } } }