aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0942-Optimise-recalcBlockCounts-for-empty-sections.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0942-Optimise-recalcBlockCounts-for-empty-sections.patch')
-rw-r--r--patches/server/0942-Optimise-recalcBlockCounts-for-empty-sections.patch37
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
+ }
+