diff --git a/patches/server/0030-Optimise-recalcBlockCounts-for-empty-sections.patch b/patches/server/0030-Optimise-recalcBlockCounts-for-empty-sections.patch new file mode 100644 index 0000000..6c308ac --- /dev/null +++ b/patches/server/0030-Optimise-recalcBlockCounts-for-empty-sections.patch @@ -0,0 +1,37 @@ +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())) { // Folia - 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 { + } + + }); ++ } // Folia - do not run forEachLocation on clearly empty sections + // Paper end + this.initBlockCollisionData(); // Paper + }