DynamicNetwork and subclass capacity optimizations
Store the network's capacity on the object rather than calculating it every time it's requested. Update the stored value when the network changes.
This commit is contained in:
parent
0d7a1ef340
commit
05713b26ed
4 changed files with 58 additions and 12 deletions
common/mekanism
|
@ -44,12 +44,14 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
|
||||||
public GasNetwork(IGridTransmitter<GasNetwork>... varPipes)
|
public GasNetwork(IGridTransmitter<GasNetwork>... varPipes)
|
||||||
{
|
{
|
||||||
transmitters.addAll(Arrays.asList(varPipes));
|
transmitters.addAll(Arrays.asList(varPipes));
|
||||||
|
updateCapacity();
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
|
||||||
public GasNetwork(Collection<IGridTransmitter<GasNetwork>> collection)
|
public GasNetwork(Collection<IGridTransmitter<GasNetwork>> collection)
|
||||||
{
|
{
|
||||||
transmitters.addAll(collection);
|
transmitters.addAll(collection);
|
||||||
|
updateCapacity();
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +96,7 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
|
||||||
|
|
||||||
gasScale = getScale();
|
gasScale = getScale();
|
||||||
|
|
||||||
|
updateCapacity();
|
||||||
refresh();
|
refresh();
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
@ -300,6 +303,7 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
|
||||||
{
|
{
|
||||||
Set<IGridTransmitter<GasNetwork>> iterTubes = (Set<IGridTransmitter<GasNetwork>>)transmitters.clone();
|
Set<IGridTransmitter<GasNetwork>> iterTubes = (Set<IGridTransmitter<GasNetwork>>)transmitters.clone();
|
||||||
Iterator<IGridTransmitter<GasNetwork>> it = iterTubes.iterator();
|
Iterator<IGridTransmitter<GasNetwork>> it = iterTubes.iterator();
|
||||||
|
boolean networkChanged = false;
|
||||||
|
|
||||||
possibleAcceptors.clear();
|
possibleAcceptors.clear();
|
||||||
acceptorDirections.clear();
|
acceptorDirections.clear();
|
||||||
|
@ -311,6 +315,7 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
|
||||||
if(conductor == null || ((TileEntity)conductor).isInvalid())
|
if(conductor == null || ((TileEntity)conductor).isInvalid())
|
||||||
{
|
{
|
||||||
it.remove();
|
it.remove();
|
||||||
|
networkChanged = true;
|
||||||
transmitters.remove(conductor);
|
transmitters.remove(conductor);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -333,6 +338,10 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (networkChanged) {
|
||||||
|
updateCapacity();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -31,6 +31,9 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
|
||||||
|
|
||||||
protected int ticksSinceCreate = 0;
|
protected int ticksSinceCreate = 0;
|
||||||
|
|
||||||
|
protected int capacity = 0;
|
||||||
|
protected double meanCapacity = 0;
|
||||||
|
|
||||||
protected boolean fixed = false;
|
protected boolean fixed = false;
|
||||||
|
|
||||||
protected boolean needsUpdate = false;
|
protected boolean needsUpdate = false;
|
||||||
|
@ -44,6 +47,7 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
|
||||||
public void addAllTransmitters(Set<IGridTransmitter<N>> newTransmitters)
|
public void addAllTransmitters(Set<IGridTransmitter<N>> newTransmitters)
|
||||||
{
|
{
|
||||||
transmitters.addAll(newTransmitters);
|
transmitters.addAll(newTransmitters);
|
||||||
|
updateCapacity();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFirst(IGridTransmitter<N> transmitter)
|
public boolean isFirst(IGridTransmitter<N> transmitter)
|
||||||
|
@ -55,6 +59,7 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
|
||||||
public void removeTransmitter(IGridTransmitter<N> transmitter)
|
public void removeTransmitter(IGridTransmitter<N> transmitter)
|
||||||
{
|
{
|
||||||
transmitters.remove(transmitter);
|
transmitters.remove(transmitter);
|
||||||
|
updateCapacity();
|
||||||
|
|
||||||
if(transmitters.size() == 0)
|
if(transmitters.size() == 0)
|
||||||
{
|
{
|
||||||
|
@ -107,18 +112,31 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
|
||||||
return possibleAcceptors.size();
|
return possibleAcceptors.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getCapacity()
|
protected synchronized void updateCapacity() {
|
||||||
{
|
updateMeanCapacity();
|
||||||
return (int)getMeanCapacity() * transmitters.size();
|
capacity = (int)meanCapacity * transmitters.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override this if things can have variable capacity along the network.
|
* Override this if things can have variable capacity along the network.
|
||||||
* @return An 'average' value of capacity. Calculate it how you will.
|
* @return An 'average' value of capacity. Calculate it how you will.
|
||||||
*/
|
*/
|
||||||
|
protected synchronized void updateMeanCapacity() {
|
||||||
|
if (transmitters.size() > 0) {
|
||||||
|
meanCapacity = transmitters.iterator().next().getCapacity();
|
||||||
|
} else {
|
||||||
|
meanCapacity = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCapacity()
|
||||||
|
{
|
||||||
|
return capacity;
|
||||||
|
}
|
||||||
|
|
||||||
public double getMeanCapacity()
|
public double getMeanCapacity()
|
||||||
{
|
{
|
||||||
return transmitters.size() > 0 ? transmitters.iterator().next().getCapacity() : 0;
|
return meanCapacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -38,15 +38,18 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
|
||||||
|
|
||||||
public double electricityStored;
|
public double electricityStored;
|
||||||
|
|
||||||
|
|
||||||
public EnergyNetwork(IGridTransmitter<EnergyNetwork>... varCables)
|
public EnergyNetwork(IGridTransmitter<EnergyNetwork>... varCables)
|
||||||
{
|
{
|
||||||
transmitters.addAll(Arrays.asList(varCables));
|
transmitters.addAll(Arrays.asList(varCables));
|
||||||
|
updateCapacity();
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
|
||||||
public EnergyNetwork(Collection<IGridTransmitter<EnergyNetwork>> collection)
|
public EnergyNetwork(Collection<IGridTransmitter<EnergyNetwork>> collection)
|
||||||
{
|
{
|
||||||
transmitters.addAll(collection);
|
transmitters.addAll(collection);
|
||||||
|
updateCapacity();
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,9 +84,8 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getMeanCapacity()
|
protected synchronized void updateMeanCapacity()
|
||||||
{
|
{
|
||||||
//Use the harmonic mean. Because we're mean.
|
|
||||||
int numCables = transmitters.size();
|
int numCables = transmitters.size();
|
||||||
double reciprocalSum = 0;
|
double reciprocalSum = 0;
|
||||||
|
|
||||||
|
@ -91,8 +93,8 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
|
||||||
{
|
{
|
||||||
reciprocalSum += 1.0/(double)cable.getCapacity();
|
reciprocalSum += 1.0/(double)cable.getCapacity();
|
||||||
}
|
}
|
||||||
|
|
||||||
return (double)numCables / reciprocalSum;
|
meanCapacity = (double)numCables / reciprocalSum;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -105,8 +107,9 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
|
||||||
|
|
||||||
for(EnergyNetwork network : networks)
|
for(EnergyNetwork network : networks)
|
||||||
{
|
{
|
||||||
caps[networks.indexOf(network)] = network.getCapacity();
|
double networkCapacity = network.getCapacity();
|
||||||
cap += network.getCapacity();
|
caps[networks.indexOf(network)] = networkCapacity;
|
||||||
|
cap += networkCapacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
electricityStored = Math.min(cap, electricityStored);
|
electricityStored = Math.min(cap, electricityStored);
|
||||||
|
@ -312,6 +315,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
|
||||||
{
|
{
|
||||||
Set<IGridTransmitter<EnergyNetwork>> iterCables = (Set<IGridTransmitter<EnergyNetwork>>)transmitters.clone();
|
Set<IGridTransmitter<EnergyNetwork>> iterCables = (Set<IGridTransmitter<EnergyNetwork>>)transmitters.clone();
|
||||||
Iterator<IGridTransmitter<EnergyNetwork>> it = iterCables.iterator();
|
Iterator<IGridTransmitter<EnergyNetwork>> it = iterCables.iterator();
|
||||||
|
boolean networkChanged = false;
|
||||||
|
|
||||||
possibleAcceptors.clear();
|
possibleAcceptors.clear();
|
||||||
acceptorDirections.clear();
|
acceptorDirections.clear();
|
||||||
|
@ -324,6 +328,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
|
||||||
{
|
{
|
||||||
it.remove();
|
it.remove();
|
||||||
transmitters.remove(conductor);
|
transmitters.remove(conductor);
|
||||||
|
networkChanged = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
conductor.setTransmitterNetwork(this);
|
conductor.setTransmitterNetwork(this);
|
||||||
|
@ -345,7 +350,11 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (networkChanged) {
|
||||||
|
this.updateCapacity();
|
||||||
|
}
|
||||||
|
|
||||||
needsUpdate = true;
|
needsUpdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,6 +457,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
|
||||||
network.joulesTransmitted = joulesTransmitted;
|
network.joulesTransmitted = joulesTransmitted;
|
||||||
network.lastPowerScale = lastPowerScale;
|
network.lastPowerScale = lastPowerScale;
|
||||||
network.electricityStored += electricityStored;
|
network.electricityStored += electricityStored;
|
||||||
|
network.updateCapacity();
|
||||||
return network;
|
return network;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,12 +42,14 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
|
||||||
public FluidNetwork(IGridTransmitter<FluidNetwork>... varPipes)
|
public FluidNetwork(IGridTransmitter<FluidNetwork>... varPipes)
|
||||||
{
|
{
|
||||||
transmitters.addAll(Arrays.asList(varPipes));
|
transmitters.addAll(Arrays.asList(varPipes));
|
||||||
|
updateCapacity();
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
|
||||||
public FluidNetwork(Collection<IGridTransmitter<FluidNetwork>> collection)
|
public FluidNetwork(Collection<IGridTransmitter<FluidNetwork>> collection)
|
||||||
{
|
{
|
||||||
transmitters.addAll(collection);
|
transmitters.addAll(collection);
|
||||||
|
updateCapacity();
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +94,7 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
|
||||||
|
|
||||||
fluidScale = getScale();
|
fluidScale = getScale();
|
||||||
|
|
||||||
|
updateCapacity();
|
||||||
refresh();
|
refresh();
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
@ -295,6 +298,7 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
|
||||||
{
|
{
|
||||||
Set<IGridTransmitter<FluidNetwork>> iterPipes = (Set<IGridTransmitter<FluidNetwork>>)transmitters.clone();
|
Set<IGridTransmitter<FluidNetwork>> iterPipes = (Set<IGridTransmitter<FluidNetwork>>)transmitters.clone();
|
||||||
Iterator it = iterPipes.iterator();
|
Iterator it = iterPipes.iterator();
|
||||||
|
boolean networkChanged = false;
|
||||||
|
|
||||||
possibleAcceptors.clear();
|
possibleAcceptors.clear();
|
||||||
acceptorDirections.clear();
|
acceptorDirections.clear();
|
||||||
|
@ -306,6 +310,7 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
|
||||||
if(conductor == null || ((TileEntity)conductor).isInvalid())
|
if(conductor == null || ((TileEntity)conductor).isInvalid())
|
||||||
{
|
{
|
||||||
it.remove();
|
it.remove();
|
||||||
|
networkChanged = true;
|
||||||
transmitters.remove(conductor);
|
transmitters.remove(conductor);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -328,6 +333,10 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(networkChanged) {
|
||||||
|
updateCapacity();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Add table
Reference in a new issue