From c1e4af925ee61d376b6ece1587ed123ad1dd6a27 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Wed, 25 May 2016 19:38:45 +0200 Subject: [PATCH] Fixed grid performance by not sending grid data so often --- CHANGELOG.md | 3 + .../java/refinedstorage/block/BlockGrid.java | 2 + .../container/ContainerGrid.java | 4 +- .../network/MessageGridCraftingShift.java | 2 +- .../network/MessageGridCraftingTransfer.java | 2 +- .../network/MessageGridItems.java | 55 ++++++++ .../network/MessageWirelessGridItems.java | 47 ------- .../refinedstorage/proxy/CommonProxy.java | 2 +- .../tile/controller/TileController.java | 132 ++++++++++-------- .../tile/controller/WirelessGridHandler.java | 11 +- .../java/refinedstorage/tile/grid/IGrid.java | 2 + .../refinedstorage/tile/grid/TileGrid.java | 28 ++-- .../tile/grid/WirelessGrid.java | 15 +- 13 files changed, 170 insertions(+), 135 deletions(-) create mode 100755 src/main/java/refinedstorage/network/MessageGridItems.java delete mode 100755 src/main/java/refinedstorage/network/MessageWirelessGridItems.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cd23949d..3c04b040f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Refined Storage Changelog ### 0.7.3 +**Bugfixes** +- Fixed grid performance by not sending grid data so often + **Features** - Crafting tasks are now sorted from new to old in the Crafting Monitor diff --git a/src/main/java/refinedstorage/block/BlockGrid.java b/src/main/java/refinedstorage/block/BlockGrid.java index 846905f15..40b59052e 100755 --- a/src/main/java/refinedstorage/block/BlockGrid.java +++ b/src/main/java/refinedstorage/block/BlockGrid.java @@ -61,6 +61,8 @@ public class BlockGrid extends BlockMachine { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { + ((TileGrid) world.getTileEntity(pos)).onGridOpened(player); + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.GRID, world, pos.getX(), pos.getY(), pos.getZ()); } diff --git a/src/main/java/refinedstorage/container/ContainerGrid.java b/src/main/java/refinedstorage/container/ContainerGrid.java index ecf759338..678716eb1 100755 --- a/src/main/java/refinedstorage/container/ContainerGrid.java +++ b/src/main/java/refinedstorage/container/ContainerGrid.java @@ -74,8 +74,8 @@ public class ContainerGrid extends ContainerBase { } } - public TileGrid getGrid() { - return (TileGrid) grid; + public IGrid getGrid() { + return grid; } public List getCraftingSlots() { diff --git a/src/main/java/refinedstorage/network/MessageGridCraftingShift.java b/src/main/java/refinedstorage/network/MessageGridCraftingShift.java index 55e111f9e..78521cc10 100755 --- a/src/main/java/refinedstorage/network/MessageGridCraftingShift.java +++ b/src/main/java/refinedstorage/network/MessageGridCraftingShift.java @@ -42,7 +42,7 @@ public class MessageGridCraftingShift extends MessageHandlerPlayerToServer { + private TileController controller; + private List groups = new ArrayList(); + + public MessageGridItems() { + } + + public MessageGridItems(TileController controller) { + this.controller = controller; + } + + @Override + public void fromBytes(ByteBuf buf) { + int size = buf.readInt(); + + for (int i = 0; i < size; ++i) { + groups.add(new ItemGroup(buf)); + } + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(controller.getItemGroups().size()); + + for (int i = 0; i < controller.getItemGroups().size(); ++i) { + controller.getItemGroups().get(i).toBytes(buf, i); + } + } + + @Override + public IMessage onMessage(MessageGridItems message, MessageContext ctx) { + Container container = Minecraft.getMinecraft().thePlayer.openContainer; + + if (container instanceof ContainerGrid) { + ((ContainerGrid) container).getGrid().setItemGroups(message.groups); + } + + return null; + } +} diff --git a/src/main/java/refinedstorage/network/MessageWirelessGridItems.java b/src/main/java/refinedstorage/network/MessageWirelessGridItems.java deleted file mode 100755 index a99ff7824..000000000 --- a/src/main/java/refinedstorage/network/MessageWirelessGridItems.java +++ /dev/null @@ -1,47 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import refinedstorage.storage.ItemGroup; -import refinedstorage.tile.controller.TileController; -import refinedstorage.tile.grid.WirelessGrid; - -import java.util.ArrayList; -import java.util.List; - -public class MessageWirelessGridItems implements IMessage, IMessageHandler { - private TileController controller; - - public MessageWirelessGridItems() { - } - - public MessageWirelessGridItems(TileController controller) { - this.controller = controller; - } - - @Override - public void fromBytes(ByteBuf buf) { - int size = buf.readInt(); - - List groups = new ArrayList(); - - for (int i = 0; i < size; ++i) { - groups.add(new ItemGroup(buf)); - } - - WirelessGrid.ITEM_GROUPS = groups; - WirelessGrid.LAST_ITEM_GROUP_UPDATE = System.currentTimeMillis(); - } - - @Override - public void toBytes(ByteBuf buf) { - controller.writeItemGroups(buf); - } - - @Override - public IMessage onMessage(MessageWirelessGridItems message, MessageContext ctx) { - return null; - } -} diff --git a/src/main/java/refinedstorage/proxy/CommonProxy.java b/src/main/java/refinedstorage/proxy/CommonProxy.java index 964fc7319..ae5798766 100755 --- a/src/main/java/refinedstorage/proxy/CommonProxy.java +++ b/src/main/java/refinedstorage/proxy/CommonProxy.java @@ -50,7 +50,6 @@ public class CommonProxy { RefinedStorage.NETWORK.registerMessage(MessageGridCraftingPush.class, MessageGridCraftingPush.class, id++, Side.SERVER); RefinedStorage.NETWORK.registerMessage(MessageGridCraftingTransfer.class, MessageGridCraftingTransfer.class, id++, Side.SERVER); RefinedStorage.NETWORK.registerMessage(MessageWirelessGridSettingsUpdate.class, MessageWirelessGridSettingsUpdate.class, id++, Side.SERVER); - RefinedStorage.NETWORK.registerMessage(MessageWirelessGridItems.class, MessageWirelessGridItems.class, id++, Side.CLIENT); RefinedStorage.NETWORK.registerMessage(MessageWirelessGridStoragePush.class, MessageWirelessGridStoragePush.class, id++, Side.SERVER); RefinedStorage.NETWORK.registerMessage(MessageWirelessGridStoragePull.class, MessageWirelessGridStoragePull.class, id++, Side.SERVER); RefinedStorage.NETWORK.registerMessage(MessageGridCraftingShift.class, MessageGridCraftingShift.class, id++, Side.SERVER); @@ -58,6 +57,7 @@ public class CommonProxy { RefinedStorage.NETWORK.registerMessage(MessageWirelessGridCraftingStart.class, MessageWirelessGridCraftingStart.class, id++, Side.SERVER); RefinedStorage.NETWORK.registerMessage(MessageGridPatternCreate.class, MessageGridPatternCreate.class, id++, Side.SERVER); RefinedStorage.NETWORK.registerMessage(MessageCraftingMonitorCancel.class, MessageCraftingMonitorCancel.class, id++, Side.SERVER); + RefinedStorage.NETWORK.registerMessage(MessageGridItems.class, MessageGridItems.class, id++, Side.CLIENT); NetworkRegistry.INSTANCE.registerGuiHandler(RefinedStorage.INSTANCE, new GuiHandler()); diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index d05ad7bc8..e40ddeec3 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -4,6 +4,8 @@ import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; import io.netty.buffer.ByteBuf; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -12,12 +14,15 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.util.Constants; import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageUtils; import refinedstorage.block.BlockController; import refinedstorage.block.EnumControllerType; import refinedstorage.container.ContainerController; +import refinedstorage.container.ContainerGrid; import refinedstorage.item.ItemPattern; +import refinedstorage.network.MessageGridItems; import refinedstorage.storage.IStorage; import refinedstorage.storage.IStorageProvider; import refinedstorage.storage.ItemGroup; @@ -73,6 +78,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr private int wirelessGridRange; private boolean couldRun; + private boolean syncing; private long lastEnergyUpdate; @@ -163,55 +169,6 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr } } - public void syncMachines() { - this.wirelessGridRange = 0; - this.energyUsage = 0; - this.storages.clear(); - this.patterns.clear(); - - for (TileMachine machine : machines) { - if (!machine.mayUpdate()) { - continue; - } - - if (machine instanceof TileWirelessTransmitter) { - this.wirelessGridRange += ((TileWirelessTransmitter) machine).getRange(); - } - - if (machine instanceof IStorageProvider) { - ((IStorageProvider) machine).provide(storages); - } - - if (machine instanceof TileCrafter) { - TileCrafter crafter = (TileCrafter) machine; - - for (int i = 0; i < TileCrafter.PATTERN_SLOTS; ++i) { - ItemStack pattern = crafter.getPatterns().getStackInSlot(i); - - if (pattern != null && ItemPattern.isValid(pattern)) { - patterns.add(new CraftingPattern(crafter.getPos().getX(), crafter.getPos().getY(), crafter.getPos().getZ(), ItemPattern.isProcessing(pattern), ItemPattern.getInputs(pattern), ItemPattern.getOutputs(pattern))); - } - } - } - - this.energyUsage += machine.getEnergyUsage(); - } - - Collections.sort(storages, new Comparator() { - @Override - public int compare(IStorage left, IStorage right) { - if (left.getPriority() == right.getPriority()) { - return 0; - } - - return (left.getPriority() > right.getPriority()) ? -1 : 1; - } - }); - - syncItems(); - } - - public void addMachine(TileMachine machine) { machinesToAdd.add(machine); } @@ -252,14 +209,6 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr return itemGroups; } - public void writeItemGroups(ByteBuf buf) { - buf.writeInt(itemGroups.size()); - - for (ItemGroup group : itemGroups) { - group.toBytes(buf, itemGroups.indexOf(group)); - } - } - public List getCraftingTasks() { return craftingTasks; } @@ -310,7 +259,58 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr return null; } + private void syncMachines() { + this.wirelessGridRange = 0; + this.energyUsage = 0; + this.storages.clear(); + this.patterns.clear(); + + for (TileMachine machine : machines) { + if (!machine.mayUpdate()) { + continue; + } + + if (machine instanceof TileWirelessTransmitter) { + this.wirelessGridRange += ((TileWirelessTransmitter) machine).getRange(); + } + + if (machine instanceof IStorageProvider) { + ((IStorageProvider) machine).provide(storages); + } + + if (machine instanceof TileCrafter) { + TileCrafter crafter = (TileCrafter) machine; + + for (int i = 0; i < TileCrafter.PATTERN_SLOTS; ++i) { + ItemStack pattern = crafter.getPatterns().getStackInSlot(i); + + if (pattern != null && ItemPattern.isValid(pattern)) { + patterns.add(new CraftingPattern(crafter.getPos().getX(), crafter.getPos().getY(), crafter.getPos().getZ(), ItemPattern.isProcessing(pattern), ItemPattern.getInputs(pattern), ItemPattern.getOutputs(pattern))); + } + } + } + + this.energyUsage += machine.getEnergyUsage(); + } + + Collections.sort(storages, new Comparator() { + @Override + public int compare(IStorage left, IStorage right) { + if (left.getPriority() == right.getPriority()) { + return 0; + } + + return (left.getPriority() > right.getPriority()) ? -1 : 1; + } + }); + + syncItems(); + syncItemsWithClients(); + } + private void syncItems() { + this.syncing = true; + itemGroups.clear(); for (IStorage storage : storages) { @@ -360,6 +360,22 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr } itemGroups.removeAll(combinedGroups); + + this.syncing = false; + } + + public void syncItemsWithClients() { + if (!syncing) { + for (EntityPlayer player : worldObj.playerEntities) { + if (player.openContainer.getClass() == ContainerGrid.class) { + syncItemsWithClient((EntityPlayerMP) player); + } + } + } + } + + public void syncItemsWithClient(EntityPlayerMP player) { + RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player); } public boolean push(ItemStack stack) { @@ -368,6 +384,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr storage.push(stack); syncItems(); + syncItemsWithClients(); for (int i = 0; i < stack.stackSize; ++i) { if (!craftingTasks.empty()) { @@ -416,6 +433,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr if (newStack != null) { syncItems(); + syncItemsWithClients(); } return newStack; diff --git a/src/main/java/refinedstorage/tile/controller/WirelessGridHandler.java b/src/main/java/refinedstorage/tile/controller/WirelessGridHandler.java index 194d5d349..58bf27c30 100755 --- a/src/main/java/refinedstorage/tile/controller/WirelessGridHandler.java +++ b/src/main/java/refinedstorage/tile/controller/WirelessGridHandler.java @@ -9,7 +9,6 @@ import refinedstorage.RefinedStorageGui; import refinedstorage.RefinedStorageItems; import refinedstorage.RefinedStorageUtils; import refinedstorage.item.ItemWirelessGrid; -import refinedstorage.network.MessageWirelessGridItems; import refinedstorage.tile.grid.WirelessGridConsumer; import java.util.ArrayList; @@ -37,10 +36,6 @@ public class WirelessGridHandler { if (!RefinedStorageUtils.compareStack(consumer.getWirelessGrid(), consumer.getPlayer().getHeldItem(consumer.getHand()))) { consumer.getPlayer().closeScreen(); // This will call onContainerClosed on the Container and remove it from the list - } else { - if (controller.mayRun()) { - RefinedStorage.NETWORK.sendTo(new MessageWirelessGridItems(controller), (EntityPlayerMP) consumer.getPlayer()); - } } } } @@ -54,6 +49,8 @@ public class WirelessGridHandler { consumers.add(new WirelessGridConsumer(player, hand, player.getHeldItem(hand))); + controller.syncItemsWithClient((EntityPlayerMP) player); + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, controller.getWorld(), RefinedStorageUtils.getIdFromHand(hand), 0, 0); drainEnergy(player, ItemWirelessGrid.USAGE_OPEN); @@ -100,4 +97,8 @@ public class WirelessGridHandler { return null; } + + public List getConsumers() { + return consumers; + } } diff --git a/src/main/java/refinedstorage/tile/grid/IGrid.java b/src/main/java/refinedstorage/tile/grid/IGrid.java index 0646f6e50..80a2392d0 100755 --- a/src/main/java/refinedstorage/tile/grid/IGrid.java +++ b/src/main/java/refinedstorage/tile/grid/IGrid.java @@ -11,6 +11,8 @@ public interface IGrid { List getItemGroups(); + void setItemGroups(List groups); + void onItemPush(int playerSlot, boolean one); void onItemPull(int id, int flags); diff --git a/src/main/java/refinedstorage/tile/grid/TileGrid.java b/src/main/java/refinedstorage/tile/grid/TileGrid.java index 2c29fb899..95b2fb677 100755 --- a/src/main/java/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/refinedstorage/tile/grid/TileGrid.java @@ -2,6 +2,7 @@ package refinedstorage.tile.grid; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.*; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; @@ -91,6 +92,17 @@ public class TileGrid extends TileMachine implements IGrid { return itemGroups; } + @Override + public void setItemGroups(List itemGroups) { + this.itemGroups = itemGroups; + } + + public void onGridOpened(EntityPlayer player) { + if (isConnected()) { + controller.syncItemsWithClient((EntityPlayerMP) player); + } + } + @Override public void onItemPush(int playerSlot, boolean one) { RefinedStorage.NETWORK.sendToServer(new MessageGridStoragePush(getPos().getX(), getPos().getY(), getPos().getZ(), playerSlot, one)); @@ -335,12 +347,6 @@ public class TileGrid extends TileMachine implements IGrid { buf.writeInt(sortingDirection); buf.writeInt(sortingType); buf.writeInt(searchBoxMode); - - if (connected) { - controller.writeItemGroups(buf); - } else { - buf.writeInt(0); - } } @Override @@ -350,16 +356,6 @@ public class TileGrid extends TileMachine implements IGrid { sortingDirection = buf.readInt(); sortingType = buf.readInt(); searchBoxMode = buf.readInt(); - - List groups = new ArrayList(); - - int size = buf.readInt(); - - for (int i = 0; i < size; ++i) { - groups.add(new ItemGroup(buf)); - } - - itemGroups = groups; } @Override diff --git a/src/main/java/refinedstorage/tile/grid/WirelessGrid.java b/src/main/java/refinedstorage/tile/grid/WirelessGrid.java index d0eeebd99..54af5772e 100755 --- a/src/main/java/refinedstorage/tile/grid/WirelessGrid.java +++ b/src/main/java/refinedstorage/tile/grid/WirelessGrid.java @@ -21,14 +21,13 @@ import java.util.ArrayList; import java.util.List; public class WirelessGrid implements IGrid { - public static long LAST_ITEM_GROUP_UPDATE = 0; - public static List ITEM_GROUPS = new ArrayList(); - private ItemStack stack; private EnumHand hand; private int sortingType; private int sortingDirection; private int searchBoxMode; + private List itemGroups = new ArrayList(); + private long lastUpdate; public WirelessGrid(ItemStack stack, EnumHand hand) { this.stack = stack; @@ -45,7 +44,13 @@ public class WirelessGrid implements IGrid { @Override public List getItemGroups() { - return ITEM_GROUPS; + return itemGroups; + } + + @Override + public void setItemGroups(List groups) { + this.itemGroups = groups; + this.lastUpdate = System.currentTimeMillis(); } @Override @@ -114,6 +119,6 @@ public class WirelessGrid implements IGrid { @Override public boolean isConnected() { - return System.currentTimeMillis() - LAST_ITEM_GROUP_UPDATE < 1000; + return System.currentTimeMillis() - lastUpdate < 1000; } }