mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
280 lines
14 KiB
Diff
280 lines
14 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com>
|
|
Date: Thu, 24 Apr 2025 16:36:16 -0400
|
|
Subject: [PATCH] Paw optimization
|
|
|
|
Some random optimizations
|
|
|
|
- Remove Paper's dead code
|
|
- Only set shuffle random seed if is really used
|
|
- Secret patches (WIP)
|
|
|
|
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
|
|
index c83ee2137a57e62003b1d20c3ceea9f569350a53..de1f271d36c7daa10c398e146386b51e2622df9a 100644
|
|
--- a/net/minecraft/network/Connection.java
|
|
+++ b/net/minecraft/network/Connection.java
|
|
@@ -660,13 +660,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
|
if (!(this.packetListener instanceof net.minecraft.server.network.ServerLoginPacketListenerImpl loginPacketListener)
|
|
|| loginPacketListener.state != net.minecraft.server.network.ServerLoginPacketListenerImpl.State.VERIFYING
|
|
|| Connection.joinAttemptsThisTick++ < MAX_PER_TICK) {
|
|
- // Paper start - detailed watchdog information
|
|
- net.minecraft.network.protocol.PacketUtils.packetProcessing.push(this.packetListener);
|
|
- try {
|
|
tickablePacketListener.tick();
|
|
- } finally {
|
|
- net.minecraft.network.protocol.PacketUtils.packetProcessing.pop();
|
|
- } // Paper end - detailed watchdog information
|
|
} // Paper end - Buffer joins to world
|
|
}
|
|
|
|
diff --git a/net/minecraft/network/protocol/PacketUtils.java b/net/minecraft/network/protocol/PacketUtils.java
|
|
index 4535858701b2bb232b9d2feb2af6551526232ddc..e65c62dbe4c1560ae153e4c4344e9194c783a2f4 100644
|
|
--- a/net/minecraft/network/protocol/PacketUtils.java
|
|
+++ b/net/minecraft/network/protocol/PacketUtils.java
|
|
@@ -21,8 +21,6 @@ public class PacketUtils {
|
|
public static <T extends PacketListener> void ensureRunningOnSameThread(Packet<T> packet, T processor, BlockableEventLoop<?> executor) throws RunningOnDifferentThreadException {
|
|
if (!executor.isSameThread()) {
|
|
executor.executeIfPossible(() -> {
|
|
- packetProcessing.push(processor); // Paper - detailed watchdog information
|
|
- try { // Paper - detailed watchdog information
|
|
if (processor instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl serverCommonPacketListener && serverCommonPacketListener.processedDisconnect) return; // Paper - Don't handle sync packets for kicked players
|
|
if (processor.shouldHandleMessage(packet)) {
|
|
try {
|
|
@@ -37,12 +35,6 @@ public class PacketUtils {
|
|
} else {
|
|
LOGGER.debug("Ignoring packet due to disconnection: {}", packet);
|
|
}
|
|
- // Paper start - detailed watchdog information
|
|
- } finally {
|
|
- totalMainThreadPacketsProcessed.getAndIncrement();
|
|
- packetProcessing.pop();
|
|
- }
|
|
- // Paper end - detailed watchdog information
|
|
});
|
|
throw RunningOnDifferentThreadException.RUNNING_ON_DIFFERENT_THREAD;
|
|
}
|
|
@@ -69,22 +61,4 @@ public class PacketUtils {
|
|
|
|
packetListener.fillCrashReport(crashReport);
|
|
}
|
|
-
|
|
- // Paper start - detailed watchdog information
|
|
- public static final java.util.concurrent.ConcurrentLinkedDeque<PacketListener> packetProcessing = new java.util.concurrent.ConcurrentLinkedDeque<>();
|
|
- static final java.util.concurrent.atomic.AtomicLong totalMainThreadPacketsProcessed = new java.util.concurrent.atomic.AtomicLong();
|
|
-
|
|
- public static long getTotalProcessedPackets() {
|
|
- return totalMainThreadPacketsProcessed.get();
|
|
- }
|
|
-
|
|
- public static java.util.List<PacketListener> getCurrentPacketProcessors() {
|
|
- java.util.List<PacketListener> listeners = new java.util.ArrayList<>(4);
|
|
- for (PacketListener listener : packetProcessing) {
|
|
- listeners.add(listener);
|
|
- }
|
|
-
|
|
- return listeners;
|
|
- }
|
|
- // Paper end - detailed watchdog information
|
|
}
|
|
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
|
|
index b1f1b596a597d559aa672a3cb46a03917ad746af..d61da0fbe7f6c181e4084ce60bfe7dab86f361ad 100644
|
|
--- a/net/minecraft/server/level/ServerChunkCache.java
|
|
+++ b/net/minecraft/server/level/ServerChunkCache.java
|
|
@@ -504,9 +504,10 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
|
try {
|
|
this.collectTickingChunks(list);
|
|
// Paper start - chunk tick iteration optimisation
|
|
- this.shuffleRandom.setSeed(this.level.random.nextLong());
|
|
- if (!this.level.paperConfig().entities.spawning.perPlayerMobSpawns)
|
|
+ if (!this.level.paperConfig().entities.spawning.perPlayerMobSpawns) {
|
|
+ this.shuffleRandom.setSeed(this.level.random.nextLong()); // Leaf - paw optimization - Only set seed if is really used
|
|
Util.shuffle(list, this.shuffleRandom); // Paper - Optional per player mob spawns; do not need this when per-player is enabled
|
|
+ }
|
|
// Paper end - chunk tick iteration optimisation
|
|
this.tickChunks(l, list); // Gale - Purpur - remove vanilla profiler
|
|
} finally {
|
|
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
|
index e95cbbc2757ed7f8d8aa873cec6bd49269592dae..3a5d2b16b0eccc8d6a742f70039b999a364d3516 100644
|
|
--- a/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/net/minecraft/server/level/ServerLevel.java
|
|
@@ -1391,13 +1391,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
// Paper end - log detailed entity tick information
|
|
|
|
public void tickNonPassenger(Entity entity) {
|
|
- // Paper start - log detailed entity tick information
|
|
ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread("Cannot tick an entity off-main");
|
|
- try {
|
|
- if (currentlyTickingEntity.get() == null) {
|
|
- currentlyTickingEntity.lazySet(entity);
|
|
- }
|
|
- // Paper end - log detailed entity tick information
|
|
entity.setOldPosAndRot();
|
|
entity.tickCount++;
|
|
entity.totalEntityAge++; // Paper - age-like counter for all entities
|
|
@@ -1410,13 +1404,6 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
for (Entity entity1 : entity.getPassengers()) {
|
|
this.tickPassenger(entity, entity1, isActive); // Paper - EAR 2
|
|
}
|
|
- // Paper start - log detailed entity tick information
|
|
- } finally {
|
|
- if (currentlyTickingEntity.get() == entity) {
|
|
- currentlyTickingEntity.lazySet(null);
|
|
- }
|
|
- }
|
|
- // Paper end - log detailed entity tick information
|
|
}
|
|
|
|
private void tickPassenger(Entity ridingEntity, Entity passengerEntity, final boolean isActive) { // Paper - EAR 2
|
|
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
|
|
index 64f24d3e0ecb91e0b4df6229354aeac549234f1b..df23d80d6b18e900414aa02e5c1812f0a10f0fb7 100644
|
|
--- a/net/minecraft/world/entity/Entity.java
|
|
+++ b/net/minecraft/world/entity/Entity.java
|
|
@@ -1145,31 +1145,6 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
return this.onGround;
|
|
}
|
|
|
|
- // Paper start - detailed watchdog information
|
|
- public final Object posLock = new Object(); // Paper - log detailed entity tick information
|
|
-
|
|
- private Vec3 moveVector;
|
|
- private double moveStartX;
|
|
- private double moveStartY;
|
|
- private double moveStartZ;
|
|
-
|
|
- public final Vec3 getMoveVector() {
|
|
- return this.moveVector;
|
|
- }
|
|
-
|
|
- public final double getMoveStartX() {
|
|
- return this.moveStartX;
|
|
- }
|
|
-
|
|
- public final double getMoveStartY() {
|
|
- return this.moveStartY;
|
|
- }
|
|
-
|
|
- public final double getMoveStartZ() {
|
|
- return this.moveStartZ;
|
|
- }
|
|
- // Paper end - detailed watchdog information
|
|
-
|
|
public void move(MoverType type, Vec3 movement) {
|
|
// Gale start - VMP - skip entity move if movement is zero
|
|
if (!this.boundingBoxChanged && movement.equals(Vec3.ZERO)) {
|
|
@@ -1177,16 +1152,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
}
|
|
// Gale end - VMP - skip entity move if movement is zero
|
|
final Vec3 originalMovement = movement; // Paper - Expose pre-collision velocity
|
|
- // Paper start - detailed watchdog information
|
|
ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread("Cannot move an entity off-main");
|
|
- synchronized (this.posLock) {
|
|
- this.moveStartX = this.getX();
|
|
- this.moveStartY = this.getY();
|
|
- this.moveStartZ = this.getZ();
|
|
- this.moveVector = movement;
|
|
- }
|
|
- try {
|
|
- // Paper end - detailed watchdog information
|
|
if (this.noPhysics) {
|
|
this.setPos(this.getX() + movement.x, this.getY() + movement.y, this.getZ() + movement.z);
|
|
} else {
|
|
@@ -1307,13 +1273,6 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
// Gale end - skip negligible planar movement multiplication
|
|
}
|
|
}
|
|
- // Paper start - detailed watchdog information
|
|
- } finally {
|
|
- synchronized (this.posLock) { // Paper
|
|
- this.moveVector = null;
|
|
- } // Paper
|
|
- }
|
|
- // Paper end - detailed watchdog information
|
|
}
|
|
|
|
private void applyMovementEmissionAndPlaySound(Entity.MovementEmission movementEmission, Vec3 movement, BlockPos pos, BlockState state) {
|
|
@@ -4879,9 +4838,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
}
|
|
|
|
public void setDeltaMovement(Vec3 deltaMovement) {
|
|
- synchronized (this.posLock) { // Paper - detailed watchdog information
|
|
this.deltaMovement = deltaMovement;
|
|
- } // Paper - detailed watchdog information
|
|
}
|
|
|
|
public void addDeltaMovement(Vec3 addend) {
|
|
@@ -4987,9 +4944,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
}
|
|
// Paper end - Fix MC-4
|
|
if (this.position.x != x || this.position.y != y || this.position.z != z) {
|
|
- synchronized (this.posLock) { // Paper - detailed watchdog information
|
|
this.position = new Vec3(x, y, z);
|
|
- } // Paper - detailed watchdog information
|
|
int floor = Mth.floor(x);
|
|
int floor1 = Mth.floor(y);
|
|
int floor2 = Mth.floor(z);
|
|
diff --git a/net/minecraft/world/level/block/state/StateHolder.java b/net/minecraft/world/level/block/state/StateHolder.java
|
|
index 098518383d2c07491e047749ce3a834e98b85b1d..3dea58dff1dea05bd4a052684cb7978b2a63e452 100644
|
|
--- a/net/minecraft/world/level/block/state/StateHolder.java
|
|
+++ b/net/minecraft/world/level/block/state/StateHolder.java
|
|
@@ -25,7 +25,7 @@ public abstract class StateHolder<O, S> implements ca.spottedleaf.moonrise.patch
|
|
return "<NULL>";
|
|
} else {
|
|
Property<?> property = propertyEntry.getKey();
|
|
- return property.getName() + "=" + this.getName(property, propertyEntry.getValue());
|
|
+ return property.getName() + "=" + this.getName(property, propertyEntry.getValue()); // Leaf - paw optimization - diff on change
|
|
}
|
|
}
|
|
|
|
@@ -73,13 +73,37 @@ public abstract class StateHolder<O, S> implements ca.spottedleaf.moonrise.patch
|
|
stringBuilder.append(this.owner);
|
|
if (!this.getValues().isEmpty()) {
|
|
stringBuilder.append('[');
|
|
- stringBuilder.append(this.getValues().entrySet().stream().map(PROPERTY_ENTRY_TO_STRING_FUNCTION).collect(Collectors.joining(",")));
|
|
+ // Leaf start - paw optimization
|
|
+ int i = 0;
|
|
+ for (Map.Entry<Property<?>, Comparable<?>> propertyEntry : this.getValues().entrySet()) {
|
|
+ if (propertyEntry == null) {
|
|
+ stringBuilder.append("<NULL>");
|
|
+ } else {
|
|
+ Property<?> property = propertyEntry.getKey();
|
|
+ Comparable<?> value = propertyEntry.getValue();
|
|
+
|
|
+ stringBuilder.append(property.getName()).append("=").append(getValueName(property, value));
|
|
+ }
|
|
+
|
|
+ if (i < this.getValues().size() - 1) {
|
|
+ stringBuilder.append(",");
|
|
+ }
|
|
+
|
|
+ i++;
|
|
+ }
|
|
+ // Leaf end - paw optimization
|
|
stringBuilder.append(']');
|
|
}
|
|
|
|
return stringBuilder.toString();
|
|
}
|
|
|
|
+ // Leaf start - paw optimization
|
|
+ private <T extends Comparable<T>> String getValueName(Property<T> property, Comparable<?> value) {
|
|
+ return property.getName((T) value);
|
|
+ }
|
|
+ // Leaf end - paw optimization
|
|
+
|
|
public Collection<Property<?>> getProperties() {
|
|
return this.optimisedTable.getProperties(); // Paper - optimise blockstate property access
|
|
}
|
|
diff --git a/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java b/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java
|
|
index 03ec2264b19e1794b609fe09d1ceaba4e0c4d669..3f38fe0140d13c7c356340ba06b55469ede0a1ad 100644
|
|
--- a/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java
|
|
+++ b/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java
|
|
@@ -48,7 +48,7 @@ public class DesertPyramidStructure extends SinglePieceStructure {
|
|
}
|
|
}
|
|
|
|
- ObjectArrayList<BlockPos> list = new ObjectArrayList<>(set.stream().toList());
|
|
+ ObjectArrayList<BlockPos> list = new ObjectArrayList<>(set); // Leaf - paw optimization - TODO: use array
|
|
RandomSource randomSource = RandomSource.create(level.getSeed()).forkPositional().at(pieces.calculateBoundingBox().getCenter());
|
|
Util.shuffle(list, randomSource);
|
|
int min = Math.min(set.size(), randomSource.nextInt(5, 8));
|