Skip to content

Commit

Permalink
Re-apply some dropped paper performance patches
Browse files Browse the repository at this point in the history
  • Loading branch information
booky10 committed Nov 24, 2023
1 parent 1175848 commit 90bb61f
Show file tree
Hide file tree
Showing 16 changed files with 154 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <[email protected]>
Date: Mon, 27 Apr 2020 00:04:16 -0700
Subject: [PATCH] Reduce allocation of Vec3D by entity tracker


diff --git a/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java b/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java
index 33d9131e9c75ef23cd637f5d6c39a2704a0c92a5..4b6e0fe2fabcc55007fd8979e81f66df9c0278b7 100644
--- a/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java
+++ b/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java
@@ -5,7 +5,7 @@ import org.jetbrains.annotations.VisibleForTesting;

public class VecDeltaCodec {
private static final double TRUNCATION_STEPS = 4096.0D;
- private Vec3 base = Vec3.ZERO;
+ public Vec3 base = Vec3.ZERO; // Paper

@VisibleForTesting
static long encode(double value) {
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
index caa73632aee15583c6b6ed12a668c8f49b794708..73d50715d34fdf67f346672901dd1d24bb2ac7fb 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -1419,10 +1419,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
public void updatePlayer(ServerPlayer player) {
org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot
if (player != this.entity) {
- Vec3 vec3d = player.position().subtract(this.entity.position());
+ // Paper start - remove allocation of Vec3D here
+ // Vec3 vec3d = player.position().subtract(this.entity.position());
+ double vec3d_dx = player.getX() - this.entity.getX();
+ double vec3d_dz = player.getZ() - this.entity.getZ();
+ // Paper end - remove allocation of Vec3D here
int i = ChunkMap.this.getPlayerViewDistance(player);
double d0 = (double) Math.min(this.getEffectiveRange(), i * 16);
- double d1 = vec3d.x * vec3d.x + vec3d.z * vec3d.z;
+ double d1 = vec3d_dx * vec3d_dx + vec3d_dz * vec3d_dz; // Paper
double d2 = d0 * d0;
boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z);
// Paper start - check Y
diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
index 35674f92a67f93382103c2766df4b678ba5c862f..fd75d4b04ca560a3c1c0035052ff0073b7081d71 100644
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
@@ -164,7 +164,13 @@ public class ServerEntity {
i = Mth.floor(this.entity.getYRot() * 256.0F / 360.0F);
j = Mth.floor(this.entity.getXRot() * 256.0F / 360.0F);
Vec3 vec3d = this.entity.trackingPosition();
- boolean flag1 = this.positionCodec.delta(vec3d).lengthSqr() >= 7.62939453125E-6D;
+ // Paper start - reduce allocation of Vec3D here
+ Vec3 base = this.positionCodec.base;
+ double vec3d_dx = vec3d.x - base.x;
+ double vec3d_dy = vec3d.y - base.y;
+ double vec3d_dz = vec3d.z - base.z;
+ boolean flag1 = (vec3d_dx * vec3d_dx + vec3d_dy * vec3d_dy + vec3d_dz * vec3d_dz) >= 7.62939453125E-6D;
+ // Paper end - reduce allocation of Vec3D here
Packet<?> packet1 = null;
boolean flag2 = flag1 || this.tickCount % 60 == 0;
boolean flag3 = Math.abs(i - this.yRotp) >= 1 || Math.abs(j - this.xRotp) >= 1;
81 changes: 81 additions & 0 deletions patches/server/0002-Optimize-non-flush-packet-sending.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <[email protected]>
Date: Tue, 22 Sep 2020 01:49:19 -0700
Subject: [PATCH] Optimize non-flush packet sending

Places like entity tracking make heavy use of packet sending,
and internally netty will use some very expensive thread wakeup
calls when scheduling.

Thanks to various hacks in ProtocolLib as well as other
plugins, we cannot simply use a queue of packets to group
send on execute. We have to call execute for each packet.

Tux's suggestion here is exactly what was needed - tag
the Runnable indicating it should not make a wakeup call.

Big thanks to Tux for making this possible as I had given
up on this optimisation before he came along.

Locally this patch drops the entity tracker tick by a full 1.5x.

(1.20.2 update)
Netty broke this LazyRunnable system in some version - this now uses
the internal safeExecute method for lazy-scheduling the packet-sending
runnables on the event loop.

Co-authored-by: booky10 <[email protected]>

diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
index c0ea20dcee8bb293df96bc6ee019e50ad6b383fd..11805569eefe100c2f469431d77a0d5a80c53244 100644
--- a/src/main/java/net/minecraft/network/Connection.java
+++ b/src/main/java/net/minecraft/network/Connection.java
@@ -60,6 +60,21 @@ import org.slf4j.MarkerFactory;

public class Connection extends SimpleChannelInboundHandler<Packet<?>> {

+ // Paper start
+ private static final java.lang.invoke.MethodHandle SAFE_EXECUTE;
+
+ static {
+ try {
+ Class<?> abstractChannelHandlerContext = Class.forName("io.netty.channel.AbstractChannelHandlerContext");
+ SAFE_EXECUTE = java.lang.invoke.MethodHandles.privateLookupIn(abstractChannelHandlerContext, java.lang.invoke.MethodHandles.lookup())
+ .findStatic(abstractChannelHandlerContext, "safeExecute",
+ java.lang.invoke.MethodType.methodType(boolean.class, io.netty.util.concurrent.EventExecutor.class, Runnable.class, io.netty.channel.ChannelPromise.class, Object.class, boolean.class));
+ } catch (ReflectiveOperationException exception) {
+ throw new RuntimeException(exception);
+ }
+ }
+ // Paper end
+
private static final float AVERAGE_PACKETS_SMOOTHING = 0.75F;
private static final Logger LOGGER = LogUtils.getLogger();
public static final Marker ROOT_MARKER = MarkerFactory.getMarker("NETWORK");
@@ -429,9 +444,24 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
if (this.channel.eventLoop().inEventLoop()) {
this.doSendPacket(packet, callbacks, flush);
} else {
- this.channel.eventLoop().execute(() -> {
+ // Paper start - optimise packets that are not flushed
+ Runnable run = () -> {
this.doSendPacket(packet, callbacks, flush);
- });
+ };
+
+ if (flush) {
+ this.channel.eventLoop().execute(run);
+ } else {
+ // netty dropped support for LazyRunnable in some version, so
+ // this now needs to use method handles for calling lazy execute
+ try {
+ SAFE_EXECUTE.invoke(this.channel.eventLoop(), run,
+ this.channel.voidPromise(), null, true);
+ } catch (Throwable throwable) {
+ throw new RuntimeException(throwable);
+ }
+ }
+ // Paper end
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2058,7 +2058,7 @@ index 1c9742ad81f04052d2c3bc18c7636f45b2fc5160..e5c955e7e99bc07199feabfe9f030101
}
}
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
index caa73632aee15583c6b6ed12a668c8f49b794708..3abec84383a445d3ad0d3b5f613246b6ac7ee741 100644
index 73d50715d34fdf67f346672901dd1d24bb2ac7fb..74dd70ad98c6877ace93dbcdeb3e89ba1e2d0d5e 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -244,7 +244,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
Expand All @@ -2070,7 +2070,7 @@ index caa73632aee15583c6b6ed12a668c8f49b794708..3abec84383a445d3ad0d3b5f613246b6
// Paper end - optimise chunk tick iteration

public ChunkMap(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureTemplateManager structureTemplateManager, Executor executor, BlockableEventLoop<Runnable> mainThreadExecutor, LightChunkGetter chunkProvider, ChunkGenerator chunkGenerator, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier<DimensionDataStorage> persistentStateManagerFactory, int viewDistance, boolean dsync) {
@@ -1464,8 +1464,28 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -1468,8 +1468,28 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
return ChunkMap.this.level.getServer().getScaledTrackingDistance(initialDistance);
}

Expand Down Expand Up @@ -2099,7 +2099,7 @@ index caa73632aee15583c6b6ed12a668c8f49b794708..3abec84383a445d3ad0d3b5f613246b6
Iterator iterator = this.entity.getIndirectPassengers().iterator();

while (iterator.hasNext()) {
@@ -1477,6 +1497,9 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -1481,6 +1501,9 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
i = j;
}
}
Expand Down Expand Up @@ -2217,18 +2217,18 @@ index 8c33a12ca879c46893150d6adfb8aa4d397c6b4c..8afda01ebaf2b3b0cce40939ba9e8c2e

private void getFullChunk(long pos, Consumer<LevelChunk> chunkConsumer) {
diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
index 35674f92a67f93382103c2766df4b678ba5c862f..c1315a0aeabdd80b1ef5ac54f82bb651854e0fae 100644
index fd75d4b04ca560a3c1c0035052ff0073b7081d71..0b8cdf9d8012e40872bc6b5cf55c5a0a54cb1248 100644
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
@@ -178,6 +178,7 @@ public class ServerEntity {
@@ -184,6 +184,7 @@ public class ServerEntity {
boolean flag6 = k < -32768L || k > 32767L || l < -32768L || l > 32767L || i1 < -32768L || i1 > 32767L;

if (!flag6 && this.teleportDelay <= 400 && !this.wasRiding && this.wasOnGround == this.entity.onGround()&& !(io.papermc.paper.configuration.GlobalConfiguration.get().collisions.sendFullPosForHardCollidingEntities && this.entity.hardCollides())) { // Paper - send full pos for hard colliding entities to prevent collision problems due to desync
+ if (flag2 || flag3 || this.entity instanceof AbstractArrow) { // Pufferfish
if ((!flag2 || !flag3) && !(this.entity instanceof AbstractArrow)) {
if (flag2) {
packet1 = new ClientboundMoveEntityPacket.Pos(this.entity.getId(), (short) ((int) k), (short) ((int) l), (short) ((int) i1), this.entity.onGround());
@@ -191,6 +192,7 @@ public class ServerEntity {
@@ -197,6 +198,7 @@ public class ServerEntity {
flag4 = true;
flag5 = true;
}
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Subject: [PATCH] Add allowPvP gamerule


diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
index f4f8e0c0ffb7c54ccdca06f3a6c2508a094c691f..0b807c4de22bb2320ea9767d2accd7fb0bf80820 100644
index aea0b628a1510b1dad1e7bf022c251efc05c27f4..20f39f27fc3e7a4bee861b147da66f7726dc2338 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -1514,7 +1514,7 @@ public class ServerPlayer extends Player {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ index 020368da69b9a492155f6de6297f74732f4ab6ea..4a5ad92c7989d4f85eea3f2908732fb5
sender.sendMessage(Component.text("Failed to reload.", NamedTextColor.RED));
e.printStackTrace();
diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java
index 7939ad8e61f06288f5bb1fde827e938a636e63c0..fcbb75c973dfdc880d91849d2c97fc947d997e33 100644
index 13e6a1539360f48f8c8f63a9150a427de6027948..5ca225ff196958f764f2918cbd327293e91eecfa 100644
--- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java
+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java
@@ -48,8 +48,8 @@ public class PufferfishConfig {
Expand All @@ -33,7 +33,7 @@ index 7939ad8e61f06288f5bb1fde827e938a636e63c0..fcbb75c973dfdc880d91849d2c97fc94
if (configFile.exists()) {
try {
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index d51170a2ec8300bde1d02ebb499fc96e6cee83cd..26ffef198021e05d5f479d9f290228be90a93db0 100644
index 219f91409f7e4624abcba6c9c70ee8c0fa9fc89c..720db1c8e1fb66ceb157a3a29c932d8e00417e53 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -229,7 +229,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
Expand All @@ -46,7 +46,7 @@ index d51170a2ec8300bde1d02ebb499fc96e6cee83cd..26ffef198021e05d5f479d9f290228be

this.setPvpAllowed(dedicatedserverproperties.pvp);
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index d6118c7e4275f41949371023c5ea6c306ed6488c..18fc20ee23cbfca4066a07a090f28fd5547b671d 100644
index 4eb45de81fdfe765d8e6a8c2c9846d4685b29baa..58e2aa17fbd6752eef47fd0c9b6160e7bc43db67 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -179,6 +179,12 @@ public class Main {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ Subject: [PATCH] Log exceptions caused by packet sending


diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
index c0ea20dcee8bb293df96bc6ee019e50ad6b383fd..7d4b5a460ecf906c894c7682c26a59469a09ca90 100644
index 11805569eefe100c2f469431d77a0d5a80c53244..7b13453068100a62ee9650686cf81a8eefb041ec 100644
--- a/src/main/java/net/minecraft/network/Connection.java
+++ b/src/main/java/net/minecraft/network/Connection.java
@@ -209,7 +209,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
@@ -224,7 +224,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {

if (player != null) player.quitReason = org.bukkit.event.player.PlayerQuitEvent.QuitReason.ERRONEOUS_STATE; // Paper
if (flag) {
Expand All @@ -17,7 +17,7 @@ index c0ea20dcee8bb293df96bc6ee019e50ad6b383fd..7d4b5a460ecf906c894c7682c26a5946
if (this.getSending() == PacketFlow.CLIENTBOUND) {
ConnectionProtocol enumprotocol = ((ConnectionProtocol.CodecData) this.channel.attr(Connection.ATTRIBUTE_CLIENTBOUND_PROTOCOL).get()).protocol();
Packet<?> packet = enumprotocol == ConnectionProtocol.LOGIN ? new ClientboundLoginDisconnectPacket(ichatmutablecomponent) : new ClientboundDisconnectPacket(ichatmutablecomponent);
@@ -223,7 +223,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
@@ -238,7 +238,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {

this.setReadOnly();
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ index ec4325b90b5707e97927b95064ef4dd840b2a538..c754ed230a5320128839541bf707d0cb
public static final EntityDataAccessor<Integer> DATA_BACKGROUND_COLOR_ID = SynchedEntityData.defineId(Display.TextDisplay.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Byte> DATA_TEXT_OPACITY_ID = SynchedEntityData.defineId(Display.TextDisplay.class, EntityDataSerializers.BYTE);
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 1add748c0401c78e06d9a3296716fb7a7ea97f9f..868a3cb583fe2c13ffa6eca0b0cf84e6262bbca8 100644
index 7ed95c2a77fb73aff06051438c69f209ca580049..ab3f983bd028987835f11f327f4b8a3cd4c90442 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -355,7 +355,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
Expand Down

0 comments on commit 90bb61f

Please sign in to comment.