mirror of
https://github.com/PaperMC/Paper.git
synced 2024-08-26 22:50:23 +02:00
38 lines
1.9 KiB
Diff
38 lines
1.9 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
||
|
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
|
||
|
}
|