From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 15 May 2023 20:25:26 -0700 Subject: [PATCH] Optimise recalcBlockCounts() for empty sections In 1.18, every chunk section is initialised to a non-null value and recalcBlockCounts() is invoked for each section. However, in a standard world, most sections are empty. In such cases, recalcBlockCounts() would iterate over ever position - even though the block data would all be air. To avoid this, we skip searching the section unless the palette indicates there _could_ be a non-air block state or non-empty fluid state. Chunk loading initially showed that recalcBlockCounts() over sections with a ZeroBitStorage data to to take ~20% of the process, now it takes <1%. diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java index f150a16fbf888455301d8b9043f0b45fb1fa1d84..fd4c4122e3811c8f5d8c02f8faaf3579bcb8ad79 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java @@ -229,6 +229,7 @@ public class LevelChunkSection { this.nonEmptyBlockCount = 0; this.tickingBlockCount = 0; this.tickingFluidCount = 0; + if (this.maybeHas((BlockState state) -> !state.isAir() || !state.getFluidState().isEmpty())) { // Paper - do not run forEachLocation on clearly empty sections this.states.forEachLocation((BlockState iblockdata, int i) -> { FluidState fluid = iblockdata.getFluidState(); @@ -248,6 +249,7 @@ public class LevelChunkSection { } }); + } // Paper - do not run forEachLocation on clearly empty sections // Paper end this.initBlockCollisionData(); // Paper }