Performance improvement to network scanning, fixed the need to have hashCode/equals implemented on nodes as well
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
# Refined Storage Changelog
|
# Refined Storage Changelog
|
||||||
|
|
||||||
|
### 1.4.6
|
||||||
|
- Performance improvement to network scanning (raoulvdberge)
|
||||||
|
|
||||||
### 1.4.5
|
### 1.4.5
|
||||||
- Updated Forge to 2296 (raoulvdberge)
|
- Updated Forge to 2296 (raoulvdberge)
|
||||||
- Added Portable Grid (raoulvdberge)
|
- Added Portable Grid (raoulvdberge)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.network.INetworkMaster;
|
|||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@@ -71,6 +72,11 @@ public interface INetworkNode {
|
|||||||
*/
|
*/
|
||||||
BlockPos getPos();
|
BlockPos getPos();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the world of this network node
|
||||||
|
*/
|
||||||
|
World getWorld();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marks this node as dirty for saving.
|
* Marks this node as dirty for saving.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
private TileController controller;
|
private TileController controller;
|
||||||
|
|
||||||
private List<INetworkNode> nodes = new ArrayList<>();
|
private List<INetworkNode> nodes = new ArrayList<>();
|
||||||
|
private Set<Integer> nodePositions = new HashSet<>();
|
||||||
|
|
||||||
public NetworkNodeGraph(TileController controller) {
|
public NetworkNodeGraph(TileController controller) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
@@ -39,6 +40,7 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Set<INetworkNode> newNodes = new HashSet<>();
|
Set<INetworkNode> newNodes = new HashSet<>();
|
||||||
|
Set<Integer> newNodePositions = new HashSet<>();
|
||||||
Queue<NodeToCheck> toCheck = new ArrayDeque<>();
|
Queue<NodeToCheck> toCheck = new ArrayDeque<>();
|
||||||
|
|
||||||
INetworkNeighborhoodAware.Operator operator = (world, pos, side) -> {
|
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));
|
INetworkNodeProxy otherNodeProxy = NETWORK_NODE_PROXY_CAPABILITY.cast(tile.getCapability(NETWORK_NODE_PROXY_CAPABILITY, side));
|
||||||
INetworkNode otherNode = otherNodeProxy.getNode();
|
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));
|
toCheck.add(new NodeToCheck(otherNode, world, pos, side, tile));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,12 +74,17 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<INetworkNode> oldNodes = nodes;
|
List<INetworkNode> oldNodes = nodes;
|
||||||
|
Set<Integer> oldNodePositions = nodePositions;
|
||||||
|
|
||||||
nodes = new ArrayList<>(newNodes);
|
nodes = new ArrayList<>(newNodes);
|
||||||
|
nodePositions = new HashSet<>(newNodePositions);
|
||||||
|
|
||||||
boolean changed = false;
|
boolean changed = false;
|
||||||
|
|
||||||
for (INetworkNode node : nodes) {
|
for (INetworkNode node : nodes) {
|
||||||
if (!oldNodes.contains(node)) {
|
if (!oldNodePositions.contains(getNodeHash(node))) {
|
||||||
|
System.out.println("New node: " + node);
|
||||||
|
|
||||||
node.onConnected(controller);
|
node.onConnected(controller);
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
@@ -85,7 +92,9 @@ public class NetworkNodeGraph implements INetworkNodeGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (INetworkNode oldNode : oldNodes) {
|
for (INetworkNode oldNode : oldNodes) {
|
||||||
if (!nodes.contains(oldNode)) {
|
if (!nodePositions.contains(getNodeHash(oldNode))) {
|
||||||
|
System.out.println("Removed node: " + oldNode);
|
||||||
|
|
||||||
oldNode.onDisconnected(controller);
|
oldNode.onDisconnected(controller);
|
||||||
|
|
||||||
changed = true;
|
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
|
@Override
|
||||||
public List<INetworkNode> all() {
|
public List<INetworkNode> all() {
|
||||||
return nodes;
|
return nodes;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import net.minecraft.nbt.NBTTagCompound;
|
|||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
@@ -149,6 +150,11 @@ public abstract class NetworkNode implements INetworkNode, INetworkNeighborhoodA
|
|||||||
return holder.pos();
|
return holder.pos();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public World getWorld() {
|
||||||
|
return holder.world();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean canConduct(@Nullable EnumFacing direction) {
|
public boolean canConduct(@Nullable EnumFacing direction) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -186,18 +192,4 @@ public abstract class NetworkNode implements INetworkNode, INetworkNeighborhoodA
|
|||||||
public void setActive(boolean active) {
|
public void setActive(boolean active) {
|
||||||
this.active = 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user