From a8ea02ef5a35900603b777aa47506f90c9fe7e09 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 22 Feb 2015 12:27:58 +1100 Subject: [PATCH] Use FastMatches for ItemStack Dirty Check The check to find dirty itemstacks and send update packets each tick can be very intensive as it checks the entire itemstack, including the entire NBT map. To save on this, 19/20 times we will simply compare the basic count/data/type. If for some strange reason the NBT of an item already existing in an inventory is changes, it will take up to 1 second to show, with an average time of half a second. This odd 0.5 second delay is far preferable to lag every tick, and shouldn't be noticed by anyone. --- ...astMatches-for-ItemStack-Dirty-Check.patch | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 CraftBukkit-Patches/0161-Use-FastMatches-for-ItemStack-Dirty-Check.patch diff --git a/CraftBukkit-Patches/0161-Use-FastMatches-for-ItemStack-Dirty-Check.patch b/CraftBukkit-Patches/0161-Use-FastMatches-for-ItemStack-Dirty-Check.patch new file mode 100644 index 000000000..655cc380e --- /dev/null +++ b/CraftBukkit-Patches/0161-Use-FastMatches-for-ItemStack-Dirty-Check.patch @@ -0,0 +1,62 @@ +From 1cc482cfee6e48b334d1243fd0665c22d1b9537d Mon Sep 17 00:00:00 2001 +From: md_5 +Date: Sun, 22 Feb 2015 12:27:40 +1100 +Subject: [PATCH] Use FastMatches for ItemStack Dirty Check + +The check to find dirty itemstacks and send update packets each tick can be very intensive as it checks the entire itemstack, including the entire NBT map. To save on this, 19/20 times we will simply compare the basic count/data/type. If for some strange reason the NBT of an item already existing in an inventory is changes, it will take up to 1 second to show, with an average time of half a second. This odd 0.5 second delay is far preferable to lag every tick, and shouldn't be noticed by anyone. + +diff --git a/src/main/java/net/minecraft/server/Container.java b/src/main/java/net/minecraft/server/Container.java +index 9a12b07..2cfc42d 100644 +--- a/src/main/java/net/minecraft/server/Container.java ++++ b/src/main/java/net/minecraft/server/Container.java +@@ -28,6 +28,7 @@ public abstract class Container { + private final Set h = Sets.newHashSet(); + protected List listeners = Lists.newArrayList(); + private Set i = Sets.newHashSet(); ++ private int tickCount; // Spigot + + // CraftBukkit start + public boolean checkReachable = true; +@@ -75,7 +76,7 @@ public abstract class Container { + ItemStack itemstack = ((Slot) this.c.get(i)).getItem(); + ItemStack itemstack1 = (ItemStack) this.b.get(i); + +- if (!ItemStack.matches(itemstack1, itemstack)) { ++ if (!ItemStack.fastMatches(itemstack1, itemstack) || (tickCount % 20 == 0 && !ItemStack.matches(itemstack1, itemstack))) { // Spigot + itemstack1 = itemstack == null ? null : itemstack.cloneItemStack(); + this.b.set(i, itemstack1); + +@@ -84,6 +85,7 @@ public abstract class Container { + } + } + } ++ tickCount++; // Spigot + + } + +diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java +index 596db09..169706e 100644 +--- a/src/main/java/net/minecraft/server/ItemStack.java ++++ b/src/main/java/net/minecraft/server/ItemStack.java +@@ -439,6 +439,18 @@ public final class ItemStack { + return itemstack == null && itemstack1 == null ? true : (itemstack != null && itemstack1 != null ? (itemstack.tag == null && itemstack1.tag != null ? false : itemstack.tag == null || itemstack.tag.equals(itemstack1.tag)) : false); + } + ++ // Spigot Start ++ public static boolean fastMatches(ItemStack itemstack, ItemStack itemstack1) { ++ if (itemstack == null && itemstack1 == null) { ++ return true; ++ } ++ if (itemstack != null && itemstack1 != null) { ++ return itemstack.count == itemstack1.count && itemstack.item == itemstack1.item && itemstack.damage == itemstack1.damage; ++ } ++ return false; ++ } ++ // Spigot End ++ + public static boolean matches(ItemStack itemstack, ItemStack itemstack1) { + return itemstack == null && itemstack1 == null ? true : (itemstack != null && itemstack1 != null ? itemstack.d(itemstack1) : false); + } +-- +2.1.0 +