diff options
Diffstat (limited to 'patches/server/0942-Optimise-recalcBlockCounts-for-empty-sections.patch')
-rw-r--r-- | patches/server/0942-Optimise-recalcBlockCounts-for-empty-sections.patch | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/patches/server/0942-Optimise-recalcBlockCounts-for-empty-sections.patch b/patches/server/0942-Optimise-recalcBlockCounts-for-empty-sections.patch new file mode 100644 index 0000000000..0e23a9a123 --- /dev/null +++ b/patches/server/0942-Optimise-recalcBlockCounts-for-empty-sections.patch @@ -0,0 +1,37 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Spottedleaf <[email protected]> +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 b39fea80fcb83873b7e7085eaaf935e712f0ede7..f0de72afad4bb571153436399386a6a8a70582a6 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java ++++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java +@@ -144,6 +144,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(); + +@@ -169,6 +170,7 @@ public class LevelChunkSection { + // Paper end - optimise collisions + + }); ++ } // Paper - do not run forEachLocation on clearly empty sections + // Paper end + } + |