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> { 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 void ensureRunningOnSameThread(Packet 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 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 getCurrentPacketProcessors() { - java.util.List 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 implements ca.spottedleaf.moonrise.patch return ""; } 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 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, Comparable> propertyEntry : this.getValues().entrySet()) { + if (propertyEntry == null) { + stringBuilder.append(""); + } 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 > String getValueName(Property property, Comparable value) { + return property.getName((T) value); + } + // Leaf end - paw optimization + public Collection> 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 list = new ObjectArrayList<>(set.stream().toList()); + ObjectArrayList 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));