From 2df1813a4ca0de3cb400ca5c23f2cbb7d8dfb92b Mon Sep 17 00:00:00 2001 From: Swedz Date: Tue, 10 Mar 2026 22:37:39 -0400 Subject: [PATCH 1/2] Cache ItemStacks to improve performance --- .../inventory/ConfigurableItemStack.java | 29 +++++++++++++++++++ .../inventory/MIItemStorage.java | 3 +- .../api/bridge/SlotItemHandler.java | 26 +++++++++++++++-- .../impl/item/ItemVariantImpl.java | 4 +-- 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/main/java/aztech/modern_industrialization/inventory/ConfigurableItemStack.java b/src/main/java/aztech/modern_industrialization/inventory/ConfigurableItemStack.java index 7e7a0e273..46cbd4565 100644 --- a/src/main/java/aztech/modern_industrialization/inventory/ConfigurableItemStack.java +++ b/src/main/java/aztech/modern_industrialization/inventory/ConfigurableItemStack.java @@ -28,6 +28,7 @@ import aztech.modern_industrialization.compat.viewer.ReiDraggable; import aztech.modern_industrialization.thirdparty.fabrictransfer.api.fluid.FluidVariant; import aztech.modern_industrialization.thirdparty.fabrictransfer.api.item.ItemVariant; +import aztech.modern_industrialization.thirdparty.fabrictransfer.api.storage.base.ResourceAmount; import aztech.modern_industrialization.util.Simulation; import java.util.ArrayList; import java.util.List; @@ -50,6 +51,8 @@ public class ConfigurableItemStack extends AbstractConfigurableStack implements ItemAccess { private int adjustedCapacity = 64; + private @Nullable ItemStack cachedItemStack; + public ConfigurableItemStack() {} public ConfigurableItemStack(CompoundTag compound, HolderLookup.Provider registries) { @@ -191,6 +194,32 @@ public ItemVariant getVariant() { return getResource(); } + @Override + public ItemStack toStack() { + if (cachedItemStack == null) { + cachedItemStack = ItemAccess.super.toStack(); + } + return cachedItemStack; + } + + @Override + public void setAmount(long amount) { + super.setAmount(amount); + cachedItemStack = null; + } + + @Override + public void setKey(ItemVariant key) { + super.setKey(key); + cachedItemStack = null; + } + + @Override + public void revertToSnapshot(ResourceAmount ra) { + super.revertToSnapshot(ra); + cachedItemStack = null; + } + public class ConfigurableItemSlot extends HackySlot implements ReiDraggable, BackgroundRenderedSlot { private final Predicate insertPredicate; private final Runnable markDirty; diff --git a/src/main/java/aztech/modern_industrialization/inventory/MIItemStorage.java b/src/main/java/aztech/modern_industrialization/inventory/MIItemStorage.java index 02aad8399..15df5b5c3 100644 --- a/src/main/java/aztech/modern_industrialization/inventory/MIItemStorage.java +++ b/src/main/java/aztech/modern_industrialization/inventory/MIItemStorage.java @@ -26,7 +26,6 @@ import aztech.modern_industrialization.thirdparty.fabrictransfer.api.item.ItemVariant; import aztech.modern_industrialization.thirdparty.fabrictransfer.api.transaction.Transaction; -import com.google.common.primitives.Ints; import java.util.List; import java.util.Set; import net.minecraft.world.item.Item; @@ -49,7 +48,7 @@ public int getSlots() { @Override public ItemStack getStackInSlot(int slot) { - return stacks.get(slot).getVariant().toStack(Ints.saturatedCast(stacks.get(slot).getAmount())); + return stacks.get(slot).toStack(); } @Override diff --git a/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/api/bridge/SlotItemHandler.java b/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/api/bridge/SlotItemHandler.java index 614f0776f..385178a4a 100644 --- a/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/api/bridge/SlotItemHandler.java +++ b/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/api/bridge/SlotItemHandler.java @@ -30,8 +30,21 @@ import com.google.common.primitives.Ints; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.IItemHandler; +import org.jspecify.annotations.Nullable; + +public final class SlotItemHandler implements IItemHandler { + private final SingleSlotStorage storage; + + private @Nullable ItemStack cachedItemStack; + + public SlotItemHandler(SingleSlotStorage storage) { + this.storage = storage; + } + + public SingleSlotStorage storage() { + return storage; + } -public record SlotItemHandler(SingleSlotStorage storage) implements IItemHandler { @Override public int getSlots() { return 1; @@ -39,7 +52,10 @@ public int getSlots() { @Override public ItemStack getStackInSlot(int slot) { - return storage.getResource().toStack(Ints.saturatedCast(storage.getAmount())); + if (cachedItemStack == null) { + cachedItemStack = storage.getResource().toStack(Ints.saturatedCast(storage.getAmount())); + } + return cachedItemStack; } @Override @@ -51,6 +67,9 @@ public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { var inserted = storage.insert(ItemVariant.of(stack), stack.getCount(), tx); if (!simulate) { tx.commit(); + if (inserted > 0) { + cachedItemStack = null; + } } return inserted == 0 ? stack : stack.copyWithCount(stack.getCount() - (int) inserted); } @@ -69,6 +88,9 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) { var extracted = storage.extract(resource, amount, tx); if (!simulate) { tx.commit(); + if (extracted > 0) { + cachedItemStack = null; + } } return extracted == 0 ? ItemStack.EMPTY : resource.toStack((int) extracted); } diff --git a/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/impl/item/ItemVariantImpl.java b/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/impl/item/ItemVariantImpl.java index 17cccd49b..5027f0629 100644 --- a/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/impl/item/ItemVariantImpl.java +++ b/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/impl/item/ItemVariantImpl.java @@ -51,7 +51,7 @@ public static ItemVariant of(ItemStack stack) { if (stack.isComponentsPatchEmpty() || stack.isEmpty()) { return of(stack.getItem()); } else { - return new ItemVariantImpl(stack); + return new ItemVariantImpl(stack.copyWithCount(1)); // defensive copy } } @@ -61,7 +61,7 @@ public static ItemVariant of(ItemStack stack) { private final int hashCode; private ItemVariantImpl(ItemStack stack) { - this.stack = stack.copyWithCount(1); // defensive copy + this.stack = stack; hashCode = ItemStack.hashItemAndComponents(stack); } From c39a87c63f0001a153bc130fae13caf2ba661af7 Mon Sep 17 00:00:00 2001 From: Swedz Date: Sun, 22 Mar 2026 15:31:41 -0400 Subject: [PATCH 2/2] Fix caching ItemStacks in ConfigurableItemStack not updating when changed by setRealStack --- .../inventory/ConfigurableItemStack.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/aztech/modern_industrialization/inventory/ConfigurableItemStack.java b/src/main/java/aztech/modern_industrialization/inventory/ConfigurableItemStack.java index 46cbd4565..7ecc78911 100644 --- a/src/main/java/aztech/modern_industrialization/inventory/ConfigurableItemStack.java +++ b/src/main/java/aztech/modern_industrialization/inventory/ConfigurableItemStack.java @@ -204,20 +204,20 @@ public ItemStack toStack() { @Override public void setAmount(long amount) { - super.setAmount(amount); cachedItemStack = null; + super.setAmount(amount); } @Override public void setKey(ItemVariant key) { - super.setKey(key); cachedItemStack = null; + super.setKey(key); } @Override public void revertToSnapshot(ResourceAmount ra) { - super.revertToSnapshot(ra); cachedItemStack = null; + super.revertToSnapshot(ra); } public class ConfigurableItemSlot extends HackySlot implements ReiDraggable, BackgroundRenderedSlot { @@ -260,6 +260,7 @@ protected ItemStack getRealStack() { protected void setRealStack(ItemStack stack) { key = ItemVariant.of(stack); amount = stack.getCount(); + cachedItemStack = null; notifyListeners(); markDirty.run(); }