Fixed performance issue with Controllers turning off and on and Interfaces, fixes #1384

This commit is contained in:
raoulvdberge
2017-07-28 22:10:05 +02:00
parent 51527d6af3
commit 283135f7e7
15 changed files with 113 additions and 53 deletions

View File

@@ -6,6 +6,8 @@
- Fixed more crashes relating to scrollbar in GUIs (raoulvdberge)
- Fixed crash with Detector (raoulvdberge)
- Fixed bug where pattern create button wasn't visible when grid tabs were selected (raoulvdberge)
- Fixed performance issue with Controllers turning off and on and Interfaces (raoulvdberge)
- Fixed Interfaces exposing network inventory don't hide storages that are disconnected (raoulvdberge)
- A Solderer with Speed Upgrades is now 2 times faster (raoulvdberge)
### 1.5.13

View File

@@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.api.network;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import java.util.Collection;
import java.util.function.Consumer;
/**
* Represents a graph of all the nodes connected to a network.
@@ -13,6 +14,13 @@ public interface INetworkNodeGraph {
*/
void rebuild();
/**
* Adds a runnable that is run after the graph is rebuilt.
*
* @param action the action to run
*/
void schedulePostRebuildAction(Consumer<INetwork> action);
/**
* @return a collection of all connected nodes
*/

View File

@@ -5,7 +5,6 @@ import com.raoulvdberge.refinedstorage.api.util.IStackList;
import javax.annotation.Nonnull;
import java.util.List;
import java.util.function.BiConsumer;
/**
* This holds all stacks from all the connected storages from a {@link INetwork}.
@@ -52,14 +51,14 @@ public interface IStorageCache<T> {
*
* @param listener the listener
*/
void addListener(BiConsumer<T, Integer> listener);
void addListener(Runnable listener);
/**
* Removes a listener from the storage cache.
*
* @param listener the listener
*/
void removeListener(BiConsumer<T, Integer> listener);
void removeListener(Runnable listener);
/**
* Resorts the storages in this cache according to their priority.

View File

@@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network;
import com.google.common.collect.Sets;
import com.raoulvdberge.refinedstorage.RSBlocks;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph;
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeVisitor;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
@@ -16,16 +17,16 @@ import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Queue;
import java.util.Set;
import java.util.*;
import java.util.function.Consumer;
import static com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY;
public class NetworkNodeGraph implements INetworkNodeGraph {
private TileController controller;
private Set<INetworkNode> nodes = Sets.newConcurrentHashSet();
private Set<Consumer<INetwork>> postRebuildActions = new HashSet<>();
private boolean rebuilding = false;
public NetworkNodeGraph(TileController controller) {
this.controller = controller;
@@ -41,6 +42,8 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
return;
}
rebuilding = true;
Operator operator = new Operator();
BlockPos controllerPos = controller.getPos();
@@ -66,9 +69,23 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
node.onDisconnected(controller);
}
postRebuildActions.forEach(a -> a.accept(controller));
postRebuildActions.clear();
if (!operator.newNodes.isEmpty() || !operator.previousNodes.isEmpty()) {
controller.getDataManager().sendParameterToWatchers(TileController.NODES);
}
rebuilding = false;
}
@Override
public void schedulePostRebuildAction(Consumer<INetwork> action) {
if (rebuilding) {
postRebuildActions.add(action);
} else {
action.accept(controller);
}
}
@Override

View File

@@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import com.raoulvdberge.refinedstorage.api.storage.IStorage;
import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheFluid;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskFluid;
import com.raoulvdberge.refinedstorage.block.BlockFluidStorage;
import com.raoulvdberge.refinedstorage.block.FluidStorageType;
@@ -117,7 +118,7 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage,
public void onConnectedStateChange(INetwork network, boolean state) {
super.onConnectedStateChange(network, state);
network.getFluidStorageCache().invalidate();
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
}
@Override

View File

@@ -23,11 +23,24 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
private ItemHandlerBase importItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this));
private ItemHandlerBase exportSpecimenItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this));
private ItemHandlerBase exportSpecimenItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this)) {
@Override
protected void onContentsChanged(int slot) {
super.onContentsChanged(slot);
if (network != null) {
if (!isEmpty() && itemsStorage != null) {
removeItemStorage(network);
} else if (isEmpty() && itemsStorage == null) {
createItemStorage(network);
}
}
}
};
private ItemHandlerBase exportItems = new ItemHandlerBase(9, new ItemHandlerListenerNetworkNode(this));
private IItemHandler items = new ItemHandlerProxy(importItems, exportItems);
private ItemHandlerInterface itemsNetwork;
private ItemHandlerInterface itemsStorage;
private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ItemHandlerListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK, ItemUpgrade.TYPE_CRAFTING);
@@ -122,17 +135,25 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
protected void onConnectedStateChange(INetwork network, boolean state) {
super.onConnectedStateChange(network, state);
if (state) {
itemsNetwork = new ItemHandlerInterface(network, network.getItemStorageCache(), importItems);
network.getItemStorageCache().addListener(itemsNetwork);
} else if (itemsNetwork != null) {
network.getItemStorageCache().removeListener(itemsNetwork);
itemsNetwork = null;
if (state && exportSpecimenItems.isEmpty()) {
createItemStorage(network);
} else if (itemsStorage != null) {
removeItemStorage(network);
}
}
private void createItemStorage(INetwork network) {
itemsStorage = new ItemHandlerInterface(network, network.getItemStorageCache(), importItems);
network.getItemStorageCache().addListener(itemsStorage);
}
private void removeItemStorage(INetwork network) {
network.getItemStorageCache().removeListener(itemsStorage);
itemsStorage = null;
}
@Override
public int getCompare() {
return compare;
@@ -204,8 +225,8 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable {
return exportItems;
}
public IItemHandler getItemsOrNetworkItems() {
return (itemsNetwork != null && exportSpecimenItems.isEmpty()) ? itemsNetwork : items;
public IItemHandler getItemsOrStorage() {
return itemsStorage != null ? itemsStorage : items;
}
public IItemHandler getItems() {

View File

@@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import com.raoulvdberge.refinedstorage.api.storage.IStorage;
import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItem;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskItem;
import com.raoulvdberge.refinedstorage.block.BlockStorage;
import com.raoulvdberge.refinedstorage.block.ItemStorageType;
@@ -114,7 +115,7 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto
public void onConnectedStateChange(INetwork network, boolean state) {
super.onConnectedStateChange(network, state);
network.getItemStorageCache().invalidate();
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
}
@Override

View File

@@ -6,6 +6,8 @@ import com.raoulvdberge.refinedstorage.api.storage.*;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheFluid;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItem;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
@@ -132,8 +134,8 @@ public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IS
public void onConnectedStateChange(INetwork network, boolean state) {
super.onConnectedStateChange(network, state);
network.getItemStorageCache().invalidate();
network.getFluidStorageCache().invalidate();
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
WorldUtils.updateBlock(world, pos);
}

View File

@@ -9,6 +9,8 @@ import com.raoulvdberge.refinedstorage.api.storage.IStorageProvider;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheFluid;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItem;
import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy;
import com.raoulvdberge.refinedstorage.integration.storagedrawers.StorageItemItemRepository;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
@@ -224,8 +226,8 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP
}
}
network.getItemStorageCache().invalidate();
network.getFluidStorageCache().invalidate();
network.getNodeGraph().schedulePostRebuildAction(StorageCacheItem.INVALIDATE);
network.getNodeGraph().schedulePostRebuildAction(StorageCacheFluid.INVALIDATE);
}
@Override

View File

@@ -13,13 +13,15 @@ import javax.annotation.Nonnull;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class StorageCacheFluid implements IStorageCache<FluidStack> {
public static final Consumer<INetwork> INVALIDATE = n -> n.getFluidStorageCache().invalidate();
private INetwork network;
private CopyOnWriteArrayList<IStorage<FluidStack>> storages = new CopyOnWriteArrayList<>();
private IStackList<FluidStack> list = API.instance().createFluidStackList();
private List<BiConsumer<FluidStack, Integer>> listeners = new LinkedList<>();
private List<Runnable> listeners = new LinkedList<>();
public StorageCacheFluid(INetwork network) {
this.network = network;
@@ -47,6 +49,8 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
}
}
listeners.forEach(Runnable::run);
network.sendFluidStorageToClient();
}
@@ -56,9 +60,9 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
if (!rebuilding) {
network.sendFluidStorageDeltaToClient(stack, size);
}
listeners.forEach(l -> l.accept(stack, size));
listeners.forEach(Runnable::run);
}
}
@Override
@@ -66,17 +70,17 @@ public class StorageCacheFluid implements IStorageCache<FluidStack> {
if (list.remove(stack, size)) {
network.sendFluidStorageDeltaToClient(stack, -size);
listeners.forEach(l -> l.accept(stack, -size));
listeners.forEach(Runnable::run);
}
}
@Override
public void addListener(BiConsumer<FluidStack, Integer> listener) {
public void addListener(Runnable listener) {
listeners.add(listener);
}
@Override
public void removeListener(BiConsumer<FluidStack, Integer> listener) {
public void removeListener(Runnable listener) {
listeners.remove(listener);
}

View File

@@ -13,13 +13,15 @@ import javax.annotation.Nonnull;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class StorageCacheItem implements IStorageCache<ItemStack> {
public static final Consumer<INetwork> INVALIDATE = network -> network.getItemStorageCache().invalidate();
private INetwork network;
private CopyOnWriteArrayList<IStorage<ItemStack>> storages = new CopyOnWriteArrayList<>();
private IStackList<ItemStack> list = API.instance().createItemStackList();
private List<BiConsumer<ItemStack, Integer>> listeners = new LinkedList<>();
private List<Runnable> listeners = new LinkedList<>();
public StorageCacheItem(INetwork network) {
this.network = network;
@@ -49,6 +51,8 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
}
}
listeners.forEach(Runnable::run);
network.sendItemStorageToClient();
}
@@ -58,9 +62,9 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
if (!rebuilding) {
network.sendItemStorageDeltaToClient(stack, size);
}
listeners.forEach(l -> l.accept(stack, size));
listeners.forEach(Runnable::run);
}
}
@Override
@@ -68,17 +72,17 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
if (list.remove(stack, size)) {
network.sendItemStorageDeltaToClient(stack, -size);
listeners.forEach(l -> l.accept(stack, -size));
listeners.forEach(Runnable::run);
}
}
@Override
public void addListener(BiConsumer<ItemStack, Integer> listener) {
public void addListener(Runnable listener) {
listeners.add(listener);
}
@Override
public void removeListener(BiConsumer<ItemStack, Integer> listener) {
public void removeListener(Runnable listener) {
listeners.remove(listener);
}

View File

@@ -17,12 +17,11 @@ import javax.annotation.Nonnull;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.function.BiConsumer;
public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
private IPortableGrid portableGrid;
private IStackList<ItemStack> list = API.instance().createItemStackList();
private List<BiConsumer<ItemStack, Integer>> listeners = new LinkedList<>();
private List<Runnable> listeners = new LinkedList<>();
public StorageCacheItemPortable(IPortableGrid portableGrid) {
this.portableGrid = portableGrid;
@@ -36,6 +35,8 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
portableGrid.getStorage().getStacks().forEach(list::add);
}
listeners.forEach(Runnable::run);
portableGrid.getWatchers().forEach(this::sendUpdateTo);
}
@@ -45,9 +46,9 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
if (!rebuilding) {
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, size), (EntityPlayerMP) w));
}
listeners.forEach(l -> l.accept(stack, size));
listeners.forEach(Runnable::run);
}
}
@Override
@@ -55,17 +56,17 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
if (list.remove(stack, size)) {
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, -size), (EntityPlayerMP) w));
listeners.forEach(l -> l.accept(stack, -size));
listeners.forEach(Runnable::run);
}
}
@Override
public void addListener(BiConsumer<ItemStack, Integer> listener) {
public void addListener(Runnable listener) {
listeners.add(listener);
}
@Override
public void removeListener(BiConsumer<ItemStack, Integer> listener) {
public void removeListener(Runnable listener) {
listeners.remove(listener);
}

View File

@@ -8,9 +8,8 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull;
import java.util.function.BiConsumer;
public class ItemHandlerInterface implements IItemHandler, BiConsumer<ItemStack, Integer> {
public class ItemHandlerInterface implements IItemHandler, Runnable {
private INetwork network;
private IStorageCache<ItemStack> storageCache;
private IItemHandler importItems;
@@ -69,7 +68,7 @@ public class ItemHandlerInterface implements IItemHandler, BiConsumer<ItemStack,
}
@Override
public void accept(ItemStack stack, Integer amount) {
public void run() {
invalidate();
}

View File

@@ -8,9 +8,8 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull;
import java.util.function.BiConsumer;
public class ItemHandlerStorage implements IItemHandler, BiConsumer<ItemStack, Integer> {
public class ItemHandlerStorage implements IItemHandler, Runnable {
private IStorage<ItemStack> storage;
private IStorageCache<ItemStack> storageCache;
private ItemStack[] storageCacheData;
@@ -52,7 +51,7 @@ public class ItemHandlerStorage implements IItemHandler, BiConsumer<ItemStack, I
}
@Override
public void accept(ItemStack stack, Integer amount) {
public void run() {
invalidate();
}

View File

@@ -22,7 +22,7 @@ public class TileInterface extends TileNode<NetworkNodeInterface> {
@Override
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(getNode().getItemsOrNetworkItems());
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(getNode().getItemsOrStorage());
}
return super.getCapability(capability, facing);