diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a3a1a12a..e014b63b3 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Refined Storage Changelog +### 1.4.6 +- Performance improvement to network scanning (raoulvdberge) + ### 1.4.5 - Updated Forge to 2296 (raoulvdberge) - Added Portable Grid (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNode.java index 05bdb3634..ec98dd25a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/node/INetworkNode.java @@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -71,6 +72,11 @@ public interface INetworkNode { */ BlockPos getPos(); + /** + * @return the world of this network node + */ + World getWorld(); + /** * Marks this node as dirty for saving. */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java index d3bd6e19c..7c02db45c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeGraph.java @@ -23,6 +23,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph { private TileController controller; private List nodes = new ArrayList<>(); + private Set nodePositions = new HashSet<>(); public NetworkNodeGraph(TileController controller) { this.controller = controller; @@ -39,6 +40,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph { } Set newNodes = new HashSet<>(); + Set newNodePositions = new HashSet<>(); Queue toCheck = new ArrayDeque<>(); INetworkNeighborhoodAware.Operator operator = (world, pos, side) -> { @@ -51,7 +53,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph { INetworkNodeProxy otherNodeProxy = NETWORK_NODE_PROXY_CAPABILITY.cast(tile.getCapability(NETWORK_NODE_PROXY_CAPABILITY, side)); INetworkNode otherNode = otherNodeProxy.getNode(); - if (newNodes.add(otherNode)) { + if (newNodes.add(otherNode) && newNodePositions.add(getNodeHash(otherNode))) { toCheck.add(new NodeToCheck(otherNode, world, pos, side, tile)); } } @@ -72,12 +74,17 @@ public class NetworkNodeGraph implements INetworkNodeGraph { } List oldNodes = nodes; + Set oldNodePositions = nodePositions; + nodes = new ArrayList<>(newNodes); + nodePositions = new HashSet<>(newNodePositions); boolean changed = false; for (INetworkNode node : nodes) { - if (!oldNodes.contains(node)) { + if (!oldNodePositions.contains(getNodeHash(node))) { + System.out.println("New node: " + node); + node.onConnected(controller); changed = true; @@ -85,7 +92,9 @@ public class NetworkNodeGraph implements INetworkNodeGraph { } for (INetworkNode oldNode : oldNodes) { - if (!nodes.contains(oldNode)) { + if (!nodePositions.contains(getNodeHash(oldNode))) { + System.out.println("Removed node: " + oldNode); + oldNode.onDisconnected(controller); changed = true; @@ -97,6 +106,12 @@ public class NetworkNodeGraph implements INetworkNodeGraph { } } + private static int getNodeHash(INetworkNode node) { + int result = node.getWorld().provider.getDimension(); + result = 31 * result + node.getPos().hashCode(); + return result; + } + @Override public List all() { return nodes; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java index 29267477c..8a3438fc9 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java @@ -14,6 +14,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import javax.annotation.Nonnull; @@ -149,6 +150,11 @@ public abstract class NetworkNode implements INetworkNode, INetworkNeighborhoodA return holder.pos(); } + @Override + public World getWorld() { + return holder.world(); + } + public boolean canConduct(@Nullable EnumFacing direction) { return true; } @@ -186,18 +192,4 @@ public abstract class NetworkNode implements INetworkNode, INetworkNeighborhoodA public void setActive(boolean active) { this.active = active; } - - @Override - public boolean equals(Object o) { - return o instanceof NetworkNode - && holder.pos().equals(((NetworkNode) o).holder.pos()) - && holder.world().provider.getDimension() == ((NetworkNode) o).holder.world().provider.getDimension(); - } - - @Override - public int hashCode() { - int result = holder.pos().hashCode(); - result = 31 * result + holder.world().provider.getDimension(); - return result; - } }