52 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
						|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
 | 
						|
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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
 | 
						|
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
 | 
						|
@@ -0,0 +0,0 @@ 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<net.minecraft.network.Connection> 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
 | 
						|
         }
 | 
						|
     }
 | 
						|
 
 |