From bff5ac5d3734651b6c2d323747e41e9218dd1667 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 2 Feb 2014 12:26:23 +1100 Subject: [PATCH] Async chunk compression needs a little bit more work still, disable for now --- ...Implement-Locale-Getter-for-Players.patch} | 4 +- ...ed-Bulk-Chunk-Compression-and-Cachin.patch | 182 ------------------ ...patch => 0106-Cap-Entity-Collisions.patch} | 2 +- 3 files changed, 3 insertions(+), 185 deletions(-) rename CraftBukkit-Patches/{0106-Implement-Locale-Getter-for-Players.patch => 0105-Implement-Locale-Getter-for-Players.patch} (94%) delete mode 100644 CraftBukkit-Patches/0105-Implement-Threaded-Bulk-Chunk-Compression-and-Cachin.patch rename CraftBukkit-Patches/{0107-Cap-Entity-Collisions.patch => 0106-Cap-Entity-Collisions.patch} (97%) diff --git a/CraftBukkit-Patches/0106-Implement-Locale-Getter-for-Players.patch b/CraftBukkit-Patches/0105-Implement-Locale-Getter-for-Players.patch similarity index 94% rename from CraftBukkit-Patches/0106-Implement-Locale-Getter-for-Players.patch rename to CraftBukkit-Patches/0105-Implement-Locale-Getter-for-Players.patch index 19ae4de04..a7064eb77 100644 --- a/CraftBukkit-Patches/0106-Implement-Locale-Getter-for-Players.patch +++ b/CraftBukkit-Patches/0105-Implement-Locale-Getter-for-Players.patch @@ -1,11 +1,11 @@ -From 6b6b2aa138326bf742a1a379b23ae083617ab565 Mon Sep 17 00:00:00 2001 +From c872ee5a790604d9452b73abfcd0fd6a1c539726 Mon Sep 17 00:00:00 2001 From: Smove Date: Sat, 1 Feb 2014 18:12:16 +1100 Subject: [PATCH] Implement Locale Getter for Players diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java -index a4c8843..ec73994 100644 +index 9b853a9..95dbeb9 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java @@ -30,7 +30,7 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; diff --git a/CraftBukkit-Patches/0105-Implement-Threaded-Bulk-Chunk-Compression-and-Cachin.patch b/CraftBukkit-Patches/0105-Implement-Threaded-Bulk-Chunk-Compression-and-Cachin.patch deleted file mode 100644 index 53af35726..000000000 --- a/CraftBukkit-Patches/0105-Implement-Threaded-Bulk-Chunk-Compression-and-Cachin.patch +++ /dev/null @@ -1,182 +0,0 @@ -From d56db82cd2978a74349685a4a392da310f9822df Mon Sep 17 00:00:00 2001 -From: md_5 -Date: Tue, 28 Jan 2014 20:32:07 +1100 -Subject: [PATCH] Implement Threaded Bulk Chunk Compression and Caching - - -diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java -index 9b853a9..295b80d 100644 ---- a/src/main/java/net/minecraft/server/EntityPlayer.java -+++ b/src/main/java/net/minecraft/server/EntityPlayer.java -@@ -228,7 +228,10 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - } - - if (!arraylist.isEmpty()) { -- this.playerConnection.sendPacket(new PacketPlayOutMapChunkBulk(arraylist)); -+ // Spigot Start -+ java.util.Collections.sort( arraylist, new PlayerChunkMap.ChunkComparator( this ) ); -+ org.spigotmc.ChunkCompressor.sendAndCompress( this, new PacketPlayOutMapChunkBulk( arraylist ) ); -+ // Spigot End - Iterator iterator2 = arraylist1.iterator(); - - while (iterator2.hasNext()) { -diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java -index fc92026..484d727 100644 ---- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java -+++ b/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java -@@ -12,9 +12,9 @@ public class PacketPlayOutMapChunkBulk extends Packet { - private int[] b; - private int[] c; - private int[] d; -- private byte[] buffer; -- private byte[][] inflatedBuffers; -- private int size; -+ public byte[] buffer; // Spigot -+ public byte[][] inflatedBuffers; // Spigot -+ public int size; // Spigot - private boolean h; - private byte[] buildBuffer = new byte[0]; // CraftBukkit - remove static - // CraftBukkit start -diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java -index ae4ca63..962e902 100644 ---- a/src/main/java/net/minecraft/server/PlayerChunkMap.java -+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java -@@ -279,8 +279,27 @@ public class PlayerChunkMap { - return playermanager.d; - } - -+ // Spigot Start -+ public static class ChunkComparator implements java.util.Comparator -+ { -+ -+ private final ChunkCoordComparator base; -+ -+ public ChunkComparator(EntityPlayer player) -+ { -+ this.base = new ChunkCoordComparator( player ); -+ } -+ -+ @Override -+ public int compare(Chunk o1, Chunk o2) -+ { -+ return base.compare( o1.l(), o2.l() ); -+ } -+ -+ } - // CraftBukkit start - Sorter to load nearby chunks first -- private static class ChunkCoordComparator implements java.util.Comparator { -+ public static class ChunkCoordComparator implements java.util.Comparator { -+ // Spigot End - private int x; - private int z; - -diff --git a/src/main/java/org/spigotmc/ChunkCompressor.java b/src/main/java/org/spigotmc/ChunkCompressor.java -new file mode 100644 -index 0000000..d43e528 ---- /dev/null -+++ b/src/main/java/org/spigotmc/ChunkCompressor.java -@@ -0,0 +1,80 @@ -+package org.spigotmc; -+ -+import com.google.common.util.concurrent.ThreadFactoryBuilder; -+import java.util.Arrays; -+import java.util.Iterator; -+import java.util.LinkedHashMap; -+import java.util.logging.Level; -+import java.util.zip.CRC32; -+import net.minecraft.server.EntityPlayer; -+import net.minecraft.server.PacketPlayOutMapChunkBulk; -+import net.minecraft.util.io.netty.util.concurrent.DefaultEventExecutorGroup; -+import net.minecraft.util.io.netty.util.concurrent.EventExecutorGroup; -+import org.bukkit.Bukkit; -+ -+public class ChunkCompressor -+{ -+ -+ private static final EventExecutorGroup threadPool = new DefaultEventExecutorGroup( SpigotConfig.compressionThreads, new ThreadFactoryBuilder().setNameFormat( "Chunk Compressor #%d" ).setDaemon( true ).build() ); -+ private static final LinkedHashMap cache = new LinkedHashMap( 16, 0.75f, true ); // Defaults, order by access -+ private static volatile int cacheSize; -+ -+ public static void sendAndCompress(final EntityPlayer player, final PacketPlayOutMapChunkBulk chunk) -+ { -+ threadPool.submit( new Runnable() -+ { -+ -+ @Override -+ public void run() -+ { -+ try -+ { -+ long start = System.currentTimeMillis(); -+ boolean cached = false; -+ // Well shit, orebfuscator is at it again -+ if ( chunk.inflatedBuffers == null ) -+ { -+ Bukkit.getServer().getLogger().warning( "chunk.inflatedBuffers is null. Are you running Oreobfuscator? If so, please note that it is unsupported and will disable async compression" ); -+ player.playerConnection.sendPacket( chunk ); -+ return; -+ } -+ -+ // Here we assign a hash to the chunk based on its contents. CRC32 is fast and sufficient for use here. -+ CRC32 crc = new CRC32(); -+ for ( byte[] c : chunk.inflatedBuffers ) -+ { -+ crc.update( c ); -+ } -+ long hash = crc.getValue(); -+ -+ byte[] deflated = cache.get( hash ); -+ if ( deflated != null ) -+ { -+ chunk.buffer = deflated; -+ chunk.size = deflated.length; -+ cached = true; -+ } else -+ { -+ chunk.compress(); // Compress the chunk -+ byte[] buffer = Arrays.copyOf( chunk.buffer, chunk.size ); // Resize the array to correct sizing -+ -+ Iterator iter = cache.values().iterator(); // Grab a single iterator reference -+ // Whilst this next entry is too big for us, and we have stuff to remove -+ while ( cacheSize + buffer.length > org.spigotmc.SpigotConfig.chunkCacheBytes && iter.hasNext() ) -+ { -+ cacheSize -= iter.next().length; // Update size table -+ iter.remove(); // Remove it alltogether -+ } -+ cacheSize += buffer.length; // Update size table -+ cache.put( hash, buffer ); // Pop the new one in the cache -+ } -+ // System.out.println( "Time: " + ( System.currentTimeMillis() - start ) + " " + cached + " " + cacheSize ); -+ player.playerConnection.sendPacket( chunk ); -+ } catch ( Throwable t ) -+ { -+ Bukkit.getServer().getLogger().log( Level.WARNING, "Error compressing or caching chunk", t ); -+ } -+ } -+ } ); -+ } -+} -diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java -index 769ef2a..fb944e7 100755 ---- a/src/main/java/org/spigotmc/SpigotConfig.java -+++ b/src/main/java/org/spigotmc/SpigotConfig.java -@@ -266,4 +266,16 @@ public class SpigotConfig - { - playerShuffle = getInt( "settings.player-shuffle", 0 ); - } -+ -+ public static int compressionThreads = 1; // Stupid unit tests -+ public static int chunkCacheBytes; -+ private static void chunkStuff() -+ { -+ compressionThreads = getInt( "settings.compression-threads", 4 ); -+ Bukkit.getLogger().log( Level.INFO, "Using {0} threads for async chunk compression", compressionThreads ); -+ -+ chunkCacheBytes = getInt( "settings.compressed-chunk-cache", 64 ) << 20; -+ Bukkit.getLogger().log( Level.INFO, "Reserving {0} bytes for compressed chunk cache", chunkCacheBytes ); -+ -+ } - } --- -1.8.3.2 - diff --git a/CraftBukkit-Patches/0107-Cap-Entity-Collisions.patch b/CraftBukkit-Patches/0106-Cap-Entity-Collisions.patch similarity index 97% rename from CraftBukkit-Patches/0107-Cap-Entity-Collisions.patch rename to CraftBukkit-Patches/0106-Cap-Entity-Collisions.patch index 9fc9f74f8..ae0c56746 100644 --- a/CraftBukkit-Patches/0107-Cap-Entity-Collisions.patch +++ b/CraftBukkit-Patches/0106-Cap-Entity-Collisions.patch @@ -1,4 +1,4 @@ -From db76c53f063cc8a9ba146d427bf2ee9562f48015 Mon Sep 17 00:00:00 2001 +From 7f1f0e81cac6af732ae66ca41f6a8f02afcf5942 Mon Sep 17 00:00:00 2001 From: Aikar Date: Fri, 31 Jan 2014 11:18:34 -0500 Subject: [PATCH] Cap Entity Collisions