Further improvments for the energygrid. (#3107)

* Further improvments for the enerygrid.

Simplified quartz fiber.
Removed different Actionable code paths and replaced with a unified
approach.
Dropped lastProvider/Requester, it simply iterates over all, but still
drops them when necessary.
This commit is contained in:
yueh
2017-09-29 20:32:20 +02:00
committed by GitHub
parent 632d124359
commit 1c05dd5834
3 changed files with 112 additions and 214 deletions
+31 -108
View File
@@ -106,8 +106,6 @@ public class EnergyGridCache implements IEnergyGrid
private boolean hasPower = true;
private long ticksSinceHasPowerChange = 900;
private IAEPowerStorage lastProvider;
private IAEPowerStorage lastRequester;
private PathGridCache pgc;
private double lastStoredPower = -1;
@@ -127,7 +125,7 @@ public class EnergyGridCache implements IEnergyGrid
}
@MENetworkEventSubscribe
public void EnergyNodeChanges( final MENetworkPowerIdleChange ev )
public void nodeIdlePowerChangeHandler( final MENetworkPowerIdleChange ev )
{
// update power usage based on event.
final GridNode node = (GridNode) ev.node;
@@ -141,7 +139,7 @@ public class EnergyGridCache implements IEnergyGrid
}
@MENetworkEventSubscribe
public void EnergyNodeChanges( final MENetworkPowerStorage ev )
public void storagePowerChangeHandler( final MENetworkPowerStorage ev )
{
if( ev.storage.isAEPublicPowerStorage() )
{
@@ -247,7 +245,7 @@ public class EnergyGridCache implements IEnergyGrid
final IEnergyGridProvider next = toVisit.poll();
visited.add( next );
extracted += next.extractProviderPower( toExtract - extracted, mode, visited );
extracted += next.extractProviderPower( toExtract - extracted, mode );
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
{
@@ -299,19 +297,24 @@ public class EnergyGridCache implements IEnergyGrid
}
@Override
public double extractProviderPower( final double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
public double extractProviderPower( final double amt, final Actionable mode )
{
double extractedPower = 0;
if( mode == Actionable.SIMULATE )
{
extractedPower += this.simulateExtract( extractedPower, amt );
final Iterator<IAEPowerStorage> it = this.providers.iterator();
return extractedPower;
}
else
while( extractedPower < amt && it.hasNext() )
{
extractedPower = this.doExtract( extractedPower, amt );
final IAEPowerStorage node = it.next();
final double req = amt - extractedPower;
final double newPower = node.extractAEPower( req, mode, PowerMultiplier.ONE );
extractedPower += newPower;
if( newPower < req )
{
it.remove();
}
}
// got more then we wanted?
@@ -331,32 +334,23 @@ public class EnergyGridCache implements IEnergyGrid
}
@Override
public double injectProviderPower( double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
public double injectProviderPower( double amt, final Actionable mode )
{
if( mode == Actionable.SIMULATE )
{
final Iterator<IAEPowerStorage> it = this.requesters.iterator();
while( amt > 0 && it.hasNext() )
{
final IAEPowerStorage node = it.next();
amt = node.injectAEPower( amt, Actionable.SIMULATE );
}
}
else
if( mode == Actionable.MODULATE )
{
this.tickInjectionPerTick += amt;
}
while( amt > 0 && !this.requesters.isEmpty() )
final Iterator<IAEPowerStorage> it = this.requesters.iterator();
while( amt > 0 && it.hasNext() )
{
final IAEPowerStorage node = it.next();
amt = node.injectAEPower( amt, mode );
if( amt > 0 )
{
final IAEPowerStorage node = this.getFirstRequester();
amt = node.injectAEPower( amt, Actionable.MODULATE );
if( amt > 0 )
{
this.requesters.remove( node );
this.lastRequester = null;
}
it.remove();
}
}
@@ -364,7 +358,7 @@ public class EnergyGridCache implements IEnergyGrid
}
@Override
public double getProviderEnergyDemand( final double maxRequired, final Set<IEnergyGridProvider> seen )
public double getProviderEnergyDemand( final double maxRequired )
{
double required = 0;
@@ -381,53 +375,6 @@ public class EnergyGridCache implements IEnergyGrid
return required;
}
private double simulateExtract( double extractedPower, final double amt )
{
final Iterator<IAEPowerStorage> it = this.providers.iterator();
while( extractedPower < amt && it.hasNext() )
{
final IAEPowerStorage node = it.next();
final double req = amt - extractedPower;
final double newPower = node.extractAEPower( req, Actionable.SIMULATE, PowerMultiplier.ONE );
extractedPower += newPower;
}
return extractedPower;
}
private double doExtract( double extractedPower, final double amt )
{
while( extractedPower < amt && !this.providers.isEmpty() )
{
final IAEPowerStorage node = this.getFirstProvider();
final double req = amt - extractedPower;
final double newPower = node.extractAEPower( req, Actionable.MODULATE, PowerMultiplier.ONE );
extractedPower += newPower;
if( newPower < req )
{
this.providers.remove( node );
this.lastProvider = null;
}
}
return extractedPower;
}
private IAEPowerStorage getFirstProvider()
{
if( this.lastProvider == null )
{
final Iterator<IAEPowerStorage> i = this.providers.iterator();
this.lastProvider = i.hasNext() ? i.next() : null;
}
return this.lastProvider;
}
@Override
public double getAvgPowerUsage()
{
@@ -460,10 +407,7 @@ public class EnergyGridCache implements IEnergyGrid
final IEnergyGridProvider next = toVisit.poll();
visited.add( next );
final double cannotHold = next.injectProviderPower( amt, Actionable.SIMULATE, visited );
next.injectProviderPower( leftover - cannotHold, mode, visited );
leftover = cannotHold;
leftover = next.injectProviderPower( leftover, mode );
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
{
@@ -477,17 +421,6 @@ public class EnergyGridCache implements IEnergyGrid
return leftover;
}
private IAEPowerStorage getFirstRequester()
{
if( this.lastRequester == null )
{
final Iterator<IAEPowerStorage> i = this.requesters.iterator();
this.lastRequester = i.hasNext() ? i.next() : null;
}
return this.lastRequester;
}
@Override
public double getStoredPower()
{
@@ -519,7 +452,7 @@ public class EnergyGridCache implements IEnergyGrid
final IEnergyGridProvider next = toVisit.poll();
visited.add( next );
required += next.getProviderEnergyDemand( maxRequired - required, visited );
required += next.getProviderEnergyDemand( maxRequired - required );
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
{
@@ -569,16 +502,6 @@ public class EnergyGridCache implements IEnergyGrid
this.globalAvailablePower -= ps.getAECurrentPower();
}
if( this.lastProvider == machine )
{
this.lastProvider = null;
}
if( this.lastRequester == machine )
{
this.lastRequester = null;
}
this.providers.remove( ps );
this.requesters.remove( ps );
}