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
@@ -25,7 +25,9 @@ package appeng.api.networking.energy;
import java.util.Collection;
import java.util.Set;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import appeng.api.config.Actionable;
@@ -36,32 +38,91 @@ import appeng.api.config.Actionable;
public interface IEnergyGridProvider
{
/**
* internal use only
*
* Can return a list of providers behind the current.
*
* An example would be something acting as proxy between different {@link IEnergyGrid}s.
*
* This can contain duplicate entries, AE will ensure that each provider is only visited once.
*
* internal use only
*/
@Nonnull
Collection<IEnergyGridProvider> providers();
/**
* internal use only
*
* Extracts the requested amount from the provider.
*
* This should never forward a call to another {@link IEnergyGridProvider}, instead return them via
* {@link IEnergyGridProvider#providers()}
*
* @return the used amount
*/
double extractProviderPower( double amt, Actionable mode, Set<IEnergyGridProvider> seen );
@Nonnegative
double extractProviderPower( @Nonnegative double amt, @Nonnull Actionable mode );
/**
* Injects the offered amount into the provider.
*
* This should never forward a call to another {@link IEnergyGridProvider}, instead return them via
* {@link IEnergyGridProvider#providers()}
*
* internal use only
*
* @return the leftover amount
*/
@Nonnegative
double injectProviderPower( @Nonnegative double amt, @Nonnull Actionable mode );
/**
* internal use only
*
* Returns the current demand of an provider.
*
* This should never forward a call to another {@link IEnergyGridProvider}, instead return them via
* {@link IEnergyGridProvider#providers()}
*
*
* @param d the max amount offered, the demand should never exceed it.
* @return the total amount demanded
*/
double injectProviderPower( double amt, Actionable mode, Set<IEnergyGridProvider> seen );
/**
* internal use only
*/
double getProviderEnergyDemand( double d, Set<IEnergyGridProvider> seen );
@Nonnegative
double getProviderEnergyDemand( @Nonnegative double d );
/**
* internal use only
*
* AE currently uses this to enqueue the next visited provider.
*
* There is no guarantee that this works on in a perfect way.
* It can be limited to the returns of the past {@link IEnergyGridProvider#providers()}, but not any future one
* discovered by visiting further providers.
*
* E.g. inject into the the lowest one first or extract from the highest one.
*
* @return the current stored amount.
*
*
*/
@Nonnegative
double getProviderStoredEnergy();
/**
* internal use only
*
* AE currently uses this to enqueue the next visited provider.
*
* There is no guarantee that this works on in a perfect way.
* It can be limited to the returns of the past {@link IEnergyGridProvider#providers()}, but not any future one
* discovered by visiting further providers.
*
* E.g. inject into the the lowest one first or extract from the highest one.
*
* @return the maximum amount stored.
*/
@Nonnegative
double getProviderMaxEnergy();
}
+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 );
}
@@ -22,7 +22,6 @@ package appeng.parts.networking;
import java.util.Collection;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.Set;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@@ -135,12 +134,13 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
@Override
public Collection<IEnergyGridProvider> providers()
{
Collection<IEnergyGridProvider> stuff = new LinkedList<>();
Collection<IEnergyGridProvider> providers = new LinkedList<>();
try
{
final IEnergyGrid eg = this.getProxy().getEnergy();
stuff.add( eg );
providers.add( eg );
}
catch( final GridAccessException e )
{
@@ -150,119 +150,33 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
try
{
final IEnergyGrid eg = this.outerProxy.getEnergy();
stuff.add( eg );
providers.add( eg );
}
catch( final GridAccessException e )
{
// :P
}
return stuff;
return providers;
}
@Override
public double extractProviderPower( final double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
public double extractProviderPower( final double amt, final Actionable mode )
{
double acquiredPower = 0;
try
{
final IEnergyGrid eg = this.getProxy().getEnergy();
if( !seen.contains( eg ) )
{
acquiredPower += eg.extractProviderPower( amt - acquiredPower, mode, seen );
}
}
catch( final GridAccessException e )
{
// :P
}
try
{
final IEnergyGrid eg = this.outerProxy.getEnergy();
if( !seen.contains( eg ) )
{
acquiredPower += eg.extractProviderPower( amt - acquiredPower, mode, seen );
}
}
catch( final GridAccessException e )
{
// :P
}
return acquiredPower;
return 0;
}
@Override
public double injectProviderPower( final double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
public double injectProviderPower( final double amt, final Actionable mode )
{
double amount = amt;
try
{
final IEnergyGrid eg = this.getProxy().getEnergy();
if( !seen.contains( eg ) )
{
amount = eg.injectProviderPower( amount, mode, seen );
}
}
catch( final GridAccessException e )
{
// :P
}
try
{
final IEnergyGrid eg = this.outerProxy.getEnergy();
if( !seen.contains( eg ) )
{
amount = eg.injectProviderPower( amount, mode, seen );
}
}
catch( final GridAccessException e )
{
// :P
}
return amount;
return amt;
}
@Override
public double getProviderEnergyDemand( final double amt, final Set<IEnergyGridProvider> seen )
public double getProviderEnergyDemand( final double amt )
{
double demand = 0;
try
{
final IEnergyGrid eg = this.getProxy().getEnergy();
if( !seen.contains( eg ) )
{
demand += eg.getProviderEnergyDemand( amt - demand, seen );
}
}
catch( final GridAccessException e )
{
// :P
}
try
{
final IEnergyGrid eg = this.outerProxy.getEnergy();
if( !seen.contains( eg ) )
{
demand += eg.getProviderEnergyDemand( amt - demand, seen );
}
}
catch( final GridAccessException e )
{
// :P
}
return demand;
return 0;
}
@Override