7c2dc4b342
* finish implementing all adventure components in codecs * add some initial tests * Add round trip tests for text and translatable components * Add more round trip test data (score component is failing) * Add more round trip test data * Fix SCORE_COMPONENT_MAP_CODEC * Improve test failure messages * Add failure cases * Add a couple more test data * Make use of AdventureCodecs * Update patches after rebase * Squash changes into adventure patch * Fix AT formatting * update comment --------- Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
38 Zeilen
1.9 KiB
Diff
38 Zeilen
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 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
|
|
}
|
|
|