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 1b80a91fa36c59a31b57ef7ef4a68eacbb0f17f5..cf2c053a0e82928c7a7cf99abe1bbd1eb7824507 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java @@ -244,6 +244,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(); @@ -263,6 +264,7 @@ public class LevelChunkSection { } }); + } // Paper - do not run forEachLocation on clearly empty sections // Paper end this.initBlockCollisionData(); // Paper }