aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0053-Avoid-hopper-searches-if-there-are-no-items.patch
diff options
context:
space:
mode:
authorZach Brown <[email protected]>2017-04-22 01:16:45 -0500
committerZach Brown <[email protected]>2017-04-22 01:16:45 -0500
commit2db4e57e4d907b01eb00f8af42a27939fb844ed2 (patch)
tree9826459422cda4da803ffd22ecf71bd1db93ce12 /Spigot-Server-Patches/0053-Avoid-hopper-searches-if-there-are-no-items.patch
parent9db28f00dbcc062955bb094894a0e7efe08f5ba9 (diff)
downloadPaper-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.patch99
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
+