From 05abf4ad9568bbb0c0339683a9537d1524bcdba8 Mon Sep 17 00:00:00 2001 From: Wafarm Date: Tue, 9 Jul 2024 22:58:40 +0800 Subject: [PATCH] perf: improve performance of getSmallestEnclosure --- .../com/github/zly2006/enclosure/EnclosureList.kt | 12 +++++++++++- .../com/github/zly2006/enclosure/EnclosureArea.kt | 13 +++++++------ .../com/github/zly2006/enclosure/ServerMain.kt | 1 - 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/zly2006/enclosure/EnclosureList.kt b/src/main/java/com/github/zly2006/enclosure/EnclosureList.kt index 4c1b998..e3b4d45 100644 --- a/src/main/java/com/github/zly2006/enclosure/EnclosureList.kt +++ b/src/main/java/com/github/zly2006/enclosure/EnclosureList.kt @@ -13,7 +13,8 @@ import net.minecraft.world.PersistentState class EnclosureList(world: ServerWorld, isRoot: Boolean) : PersistentState() { private val areaMap: MutableMap = HashMap() private val boundWorld: ServerWorld? - val areas = areaMap.values + var areas: List = listOf() + private set constructor(nbt: NbtCompound, world: ServerWorld, isRoot: Boolean) : this(world, isRoot) { (nbt[ENCLOSURE_LIST_KEY] as? NbtList)?.forEach { @@ -25,6 +26,8 @@ class EnclosureList(world: ServerWorld, isRoot: Boolean) : PersistentState() { areaMap[name] = EnclosureArea(compound, world) } } + + updateAreasList() } init { @@ -75,6 +78,7 @@ class EnclosureList(world: ServerWorld, isRoot: Boolean) : PersistentState() { fun remove(name: String): Boolean { if (areaMap.containsKey(name)) { areaMap.remove(name) + updateAreasList() markDirty() return true } @@ -83,8 +87,14 @@ class EnclosureList(world: ServerWorld, isRoot: Boolean) : PersistentState() { fun addArea(area: EnclosureArea) { areaMap[area.name] = area + updateAreasList() markDirty() } + + // 添加和删除操作一般很少,慢一点无所谓 + private fun updateAreasList() { + areas = areaMap.values.toList() + } } const val DATA_VERSION_KEY = "data_version" diff --git a/src/main/kotlin/com/github/zly2006/enclosure/EnclosureArea.kt b/src/main/kotlin/com/github/zly2006/enclosure/EnclosureArea.kt index d20273d..6a4e784 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/EnclosureArea.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/EnclosureArea.kt @@ -50,12 +50,13 @@ open class EnclosureArea : PersistentState, EnclosureView { } private var locked = false - final override var minX by lockChecker(0) - final override var minY by lockChecker(0) - final override var minZ by lockChecker(0) - final override var maxX by lockChecker(0) - final override var maxY by lockChecker(0) - final override var maxZ by lockChecker(0) + // removed lockChecker due to performance issues + final override var minX = 0 + final override var minY = 0 + final override var minZ = 0 + final override var maxX = 0 + final override var maxY = 0 + final override var maxZ = 0 var world: ServerWorld protected set final override var name = "" diff --git a/src/main/kotlin/com/github/zly2006/enclosure/ServerMain.kt b/src/main/kotlin/com/github/zly2006/enclosure/ServerMain.kt index d3d2f56..3604a55 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/ServerMain.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/ServerMain.kt @@ -302,7 +302,6 @@ object ServerMain: ModInitializer { fun getSmallestEnclosure(world: ServerWorld, pos: BlockPos?): EnclosureArea? { return enclosures[world.registryKey]!!.areas .firstOrNull { area: EnclosureArea -> area.isInner(pos!!) } - ?.areaOf(pos!!) } fun checkPermission(player: ServerPlayerEntity, permission: Permission, pos: BlockPos): Boolean {