mirror of
https://github.com/PaperMC/Folia.git
synced 2024-11-21 11:55:11 +01:00
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%.
This commit is contained in:
parent
22085eae15
commit
94b1400a81
@ -0,0 +1,37 @@
|
||||
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())) { // 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user