From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Sat, 4 Apr 2020 17:00:20 -0700 Subject: [PATCH] Consolidate flush calls for entity tracker packets Most server packets seem to be sent from here, so try to avoid expensive flush calls from them. This change was motivated due to local testing: - My server spawn has 130 cows in it (for testing a prev. patch) - Try to let 200 players join spawn Without this change, I could only get 20 players on before they all started timing out due to the load put on the Netty I/O threads. With this change I could get all 200 on at 0ms ping. (one of the primary issues is that my CPU is kinda trash, and having 4 extra threads at 100% is just too much for it). So in general this patch should reduce Netty I/O thread load. diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java index 5271cc135e636961fc1248f6b98bb122ab3391e6..cd6eb305f4d36be923f6c5f0dd85e449d0f94c8f 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java @@ -1077,7 +1077,24 @@ public class ServerChunkCache extends ChunkSource { this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing gameprofilerfiller.pop(); // Paper end - use set of chunks requiring updates, rather than iterating every single one loaded + // Paper start - controlled flush for entity tracker packets + List disabledFlushes = new java.util.ArrayList<>(this.level.players.size()); + for (ServerPlayer player : this.level.players) { + net.minecraft.server.network.ServerGamePacketListenerImpl connection = player.connection; + if (connection != null) { + connection.connection.disableAutomaticFlush(); + disabledFlushes.add(connection.connection); + } + } + try { // Paper end - controlled flush for entity tracker packets this.chunkMap.tick(); + // Paper start - controlled flush for entity tracker packets + } finally { + for (net.minecraft.network.Connection networkManager : disabledFlushes) { + networkManager.enableAutomaticFlush(); + } + } + // Paper end - controlled flush for entity tracker packets } }