mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2026-01-04 15:41:40 +00:00
Originally vanilla logic is to use stream, and Mojang switched it to Guava's Collections2 since 1.21.4. It is much faster than using stream or manually adding to a new ArrayList. Manually adding to a new ArrayList requires allocating a new object array. However, the Collections2 lazy handles filter condition on iteration, so much better.
58 lines
2.7 KiB
Diff
58 lines
2.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: kidofcubes <kidofcubes@gmail.com>
|
|
Date: Sun, 16 Feb 2025 00:51:24 +0800
|
|
Subject: [PATCH] Improve BlockEntity ticking isRemoved check
|
|
|
|
Uses direct reference for isRemoved check in BlockEntity ticking,
|
|
reducing cost caused by nested wrapper calls
|
|
Leaf (Before): ~15104ms
|
|
Leaf (After): ~628ms (-96%)
|
|
This should help for massive hopper chains or hopper matrix.
|
|
|
|
diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java
|
|
index 7538f9c84e8463502f4fa1b4a84a4ac84a11e87d..514a918fff9bf60293fbfa6def4a2f9fead30825 100644
|
|
--- a/net/minecraft/world/level/chunk/LevelChunk.java
|
|
+++ b/net/minecraft/world/level/chunk/LevelChunk.java
|
|
@@ -1023,15 +1023,29 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
|
|
static class RebindableTickingBlockEntityWrapper implements TickingBlockEntity {
|
|
private TickingBlockEntity ticker;
|
|
private BlockPos cachedPos; // Leaf - Cache tile entity position
|
|
+ private @Nullable BlockEntity blockEntityReference = null; // Leaf - Improve BlockEntity ticking isRemoved check
|
|
|
|
RebindableTickingBlockEntityWrapper(TickingBlockEntity ticker) {
|
|
this.ticker = ticker;
|
|
this.cachedPos = this.ticker.getPos(); // Leaf - Cache tile entity position
|
|
+ // Leaf start - Improve BlockEntity ticking isRemoved check
|
|
+ if (ticker instanceof BoundTickingBlockEntity<?> boundTicker) {
|
|
+ blockEntityReference = boundTicker.blockEntity;
|
|
+ }
|
|
+ // Leaf end - Improve BlockEntity ticking isRemoved check
|
|
+
|
|
}
|
|
|
|
void rebind(TickingBlockEntity ticker) {
|
|
this.ticker = ticker;
|
|
this.cachedPos = this.ticker.getPos(); // Leaf - Cache tile entity position
|
|
+ // Leaf start - Improve BlockEntity ticking isRemoved check
|
|
+ if (ticker instanceof BoundTickingBlockEntity<?> boundTicker) {
|
|
+ blockEntityReference = boundTicker.blockEntity;
|
|
+ } else {
|
|
+ blockEntityReference = null;
|
|
+ }
|
|
+ // Leaf end - Improve BlockEntity ticking isRemoved check
|
|
}
|
|
|
|
@Override
|
|
@@ -1041,6 +1055,11 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
|
|
|
|
@Override
|
|
public boolean isRemoved() {
|
|
+ // Leaf start - Improve BlockEntity ticking isRemoved check
|
|
+ if (blockEntityReference != null) {
|
|
+ return blockEntityReference.isRemoved();
|
|
+ }
|
|
+ // Leaf end - Improve BlockEntity ticking isRemoved check
|
|
return this.ticker.isRemoved();
|
|
}
|
|
|