From 9ec4eb827824d26a5f676564c6002fde1251990c Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Sat, 29 Jul 2023 18:33:26 +0200 Subject: [PATCH] minor test performance improvements - ChunkHeightmap is now only calculated if dimension has light (aka. only in light tests) - occlusion culling and light is just updated when dimension has light (world filling) - ... --- .../kotlin/de/bixilon/minosoft/data/world/WorldTestUtil.kt | 6 +++--- .../minosoft/data/world/chunk/heightmap/ChunkHeightmap.kt | 2 +- .../minosoft/data/world/chunk/light/ChunkLightUtil.kt | 2 +- .../minosoft/data/world/chunk/light/ChunkSkyLight.kt | 2 +- .../bixilon/minosoft/data/world/chunk/light/SectionLight.kt | 2 +- .../minosoft/data/world/chunk/manager/ChunkManager.kt | 3 ++- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/data/world/WorldTestUtil.kt b/src/integration-test/kotlin/de/bixilon/minosoft/data/world/WorldTestUtil.kt index f8a4449fb..ceeae9aa1 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/data/world/WorldTestUtil.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/data/world/WorldTestUtil.kt @@ -91,6 +91,8 @@ object WorldTestUtil { } } + if (!dimension.light && !dimension.skyLight) return // no need for occlusion when light is ignored + if (superUnsafe) { for (x in (start.x shr 4)..(end.x shr 4)) { for (z in (start.z shr 4)..(end.z shr 4)) { @@ -107,9 +109,7 @@ object WorldTestUtil { } } } - if (dimension.light || dimension.skyLight) { - recalculateLight(heightmap = true) // yah, might break the result, don't use fill if you want to test light - } + recalculateLight(heightmap = true) // yah, might break the result, don't use fill if you want to test light } private val DATA = SectionDataProvider::class.java.getDeclaredField("data").apply { isAccessible = true } diff --git a/src/main/java/de/bixilon/minosoft/data/world/chunk/heightmap/ChunkHeightmap.kt b/src/main/java/de/bixilon/minosoft/data/world/chunk/heightmap/ChunkHeightmap.kt index 66b87628d..04c42b344 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/chunk/heightmap/ChunkHeightmap.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/chunk/heightmap/ChunkHeightmap.kt @@ -34,7 +34,7 @@ abstract class ChunkHeightmap(protected val chunk: Chunk) : Heightmap { val maxY = (chunk.maxSection + 1) * ProtocolDefinition.SECTION_HEIGHT_Y for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) { - for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) { + for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) { trace(x, maxY, z, false) } } diff --git a/src/main/java/de/bixilon/minosoft/data/world/chunk/light/ChunkLightUtil.kt b/src/main/java/de/bixilon/minosoft/data/world/chunk/light/ChunkLightUtil.kt index 2a536f358..e21de1190 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/chunk/light/ChunkLightUtil.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/chunk/light/ChunkLightUtil.kt @@ -18,6 +18,6 @@ import de.bixilon.minosoft.data.registries.dimension.DimensionProperties object ChunkLightUtil { fun DimensionProperties.hasSkyLight(): Boolean { - return this.skyLight || this.effects.skyLight + return this.light && this.skyLight } } diff --git a/src/main/java/de/bixilon/minosoft/data/world/chunk/light/ChunkSkyLight.kt b/src/main/java/de/bixilon/minosoft/data/world/chunk/light/ChunkSkyLight.kt index fb73c6b81..8ebac25f6 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/chunk/light/ChunkSkyLight.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/chunk/light/ChunkSkyLight.kt @@ -128,7 +128,7 @@ class ChunkSkyLight(val light: ChunkLight) { private fun floodFill() { val neighbours = this.chunk.neighbours.get() ?: return for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) { - for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) { + for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) { floodFill(neighbours, x, z) } } diff --git a/src/main/java/de/bixilon/minosoft/data/world/chunk/light/SectionLight.kt b/src/main/java/de/bixilon/minosoft/data/world/chunk/light/SectionLight.kt index 5806a04ab..38bd1039e 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/chunk/light/SectionLight.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/chunk/light/SectionLight.kt @@ -275,7 +275,7 @@ class SectionLight( private fun propagateX(baseY: Int, neighbours: Array) { for (y in 0 until ProtocolDefinition.SECTION_HEIGHT_Y) { - for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) { + for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) { val totalY = baseY + y neighbours[Directions.O_WEST]?.light?.get(ProtocolDefinition.SECTION_MAX_Z, y, z)?.toInt()?.let { light -> (light and BLOCK_LIGHT_MASK).let { if (it > 1) traceBlockIncrease(0, y, z, it - 1, Directions.EAST) } diff --git a/src/main/java/de/bixilon/minosoft/data/world/chunk/manager/ChunkManager.kt b/src/main/java/de/bixilon/minosoft/data/world/chunk/manager/ChunkManager.kt index 20141f802..86f7f85bc 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/chunk/manager/ChunkManager.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/chunk/manager/ChunkManager.kt @@ -135,7 +135,8 @@ class ChunkManager(val world: World, chunkCapacity: Int = 0, prototypeCapacity: size.onCreate(chunk.chunkPosition) world.view.updateServerDistance() - val updates = hashSetOf(ChunkCreateUpdate(chunk.chunkPosition, chunk)) + val updates = HashSet(9, 1.0f) + updates += ChunkCreateUpdate(chunk.chunkPosition, chunk) for (index in 0 until ChunkNeighbours.COUNT) { val offset = ChunkNeighbours.OFFSETS[index]