diff options
author | Zach Brown <[email protected]> | 2017-04-22 01:16:45 -0500 |
---|---|---|
committer | Zach Brown <[email protected]> | 2017-04-22 01:16:45 -0500 |
commit | 2db4e57e4d907b01eb00f8af42a27939fb844ed2 (patch) | |
tree | 9826459422cda4da803ffd22ecf71bd1db93ce12 /Spigot-Server-Patches/0053-Avoid-hopper-searches-if-there-are-no-items.patch | |
parent | 9db28f00dbcc062955bb094894a0e7efe08f5ba9 (diff) | |
download | Paper-2db4e57e4d907b01eb00f8af42a27939fb844ed2.tar.gz Paper-2db4e57e4d907b01eb00f8af42a27939fb844ed2.zip |
Update bStats implementation
Diffstat (limited to 'Spigot-Server-Patches/0053-Avoid-hopper-searches-if-there-are-no-items.patch')
-rw-r--r-- | Spigot-Server-Patches/0053-Avoid-hopper-searches-if-there-are-no-items.patch | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0053-Avoid-hopper-searches-if-there-are-no-items.patch b/Spigot-Server-Patches/0053-Avoid-hopper-searches-if-there-are-no-items.patch new file mode 100644 index 0000000000..f823900a13 --- /dev/null +++ b/Spigot-Server-Patches/0053-Avoid-hopper-searches-if-there-are-no-items.patch @@ -0,0 +1,99 @@ +From 082fa781df2dfffd7b1774cfe10089544daa70a9 Mon Sep 17 00:00:00 2001 +From: CullanP <[email protected]> +Date: Thu, 3 Mar 2016 02:13:38 -0600 +Subject: [PATCH] Avoid hopper searches if there are no items + +Hoppers searching for items and minecarts is the most expensive part of hopper ticking. +We keep track of the number of minecarts and items in a chunk. +If there are no items in the chunk, we skip searching for items. +If there are no minecarts in the chunk, we skip searching for them. + +Usually hoppers aren't near items, so we can skip most item searches. +And since minecart hoppers are used _very_ rarely near we can avoid alot of searching there. + +Combined, this adds up a lot. + +diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java +index b80f95159..e1fc4ea6c 100644 +--- a/src/main/java/net/minecraft/server/Chunk.java ++++ b/src/main/java/net/minecraft/server/Chunk.java +@@ -47,6 +47,13 @@ public class Chunk { + public boolean d; + protected gnu.trove.map.hash.TObjectIntHashMap<Class> entityCount = new gnu.trove.map.hash.TObjectIntHashMap<Class>(); // Spigot + ++ // Paper start ++ // Track the number of minecarts and items ++ // Keep this synced with entitySlices.add() and entitySlices.remove() ++ private final int[] itemCounts = new int[16]; ++ private final int[] inventoryEntityCounts = new int[16]; ++ // Paper end ++ + // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking + private int neighbors = 0x1 << 12; + public long chunkKey; +@@ -618,6 +625,13 @@ public class Chunk { + entity.ac = k; + entity.ad = this.locZ; + this.entitySlices[k].add(entity); ++ // Paper start - update count ++ if (entity instanceof EntityItem) { ++ itemCounts[k]++; ++ } else if (entity instanceof IInventory) { ++ inventoryEntityCounts[k]++; ++ } ++ // Paper end + // Spigot start - increment creature type count + // Keep this synced up with World.a(Class) + if (entity instanceof EntityInsentient) { +@@ -650,6 +664,13 @@ public class Chunk { + } + + this.entitySlices[i].remove(entity); ++ // Paper start - update counts ++ if (entity instanceof EntityItem) { ++ itemCounts[i]--; ++ } else if (entity instanceof IInventory) { ++ inventoryEntityCounts[i]--; ++ } ++ // Paper end + // Spigot start - decrement creature type count + // Keep this synced up with World.a(Class) + if (entity instanceof EntityInsentient) { +@@ -841,6 +862,15 @@ public class Chunk { + if (!this.entitySlices[k].isEmpty()) { + Iterator iterator = this.entitySlices[k].iterator(); + ++ // Paper start - Don't search for inventories if we have none, and that is all we want ++ /* ++ * We check if they want inventories by seeing if it is the static `IEntitySelector.c` ++ * ++ * Make sure the inventory selector stays in sync. ++ * It should be the one that checks `var1 instanceof IInventory && var1.isAlive()` ++ */ ++ if (predicate == IEntitySelector.c && inventoryEntityCounts[k] <= 0) continue; ++ // Paper end + while (iterator.hasNext()) { + Entity entity1 = (Entity) iterator.next(); + +@@ -877,7 +907,18 @@ public class Chunk { + i = MathHelper.clamp(i, 0, this.entitySlices.length - 1); + j = MathHelper.clamp(j, 0, this.entitySlices.length - 1); + ++ // Paper start ++ int[] counts; ++ if (EntityItem.class.isAssignableFrom(oclass)) { ++ counts = itemCounts; ++ } else if (IInventory.class.isAssignableFrom(oclass)) { ++ counts = inventoryEntityCounts; ++ } else { ++ counts = null; ++ } ++ // Paper end + for (int k = i; k <= j; ++k) { ++ if (counts != null && counts[k] <= 0) continue; // Paper - Don't check a chunk if it doesn't have the type we are looking for + Iterator iterator = this.entitySlices[k].iterator(); // Spigot + + while (iterator.hasNext()) { +-- +2.12.2 + |