Performance improvements for the energygrid (#3051)
* Performance improvements for the energygrid Reworked the old recursive approach to a queue based loop. Extract will try to prefer the next grid with the hightest amount of stored energy. Inject will try to prefer the grid with the lowest percentage stored. Other operations are first come, first serve. * Added a local buffer storage to EnergyGrid This replaces the old not really working buffer with a special IAEPowerStorage acting as buffer/proxy for the local energy demand as well as temporary overflow should something provide more energy than requested. Currently it set to hold a maximum of 200 AE (+ optional overflow until consumed). It will only be used locally, no other grid can use it to avoid starving the neighbor grids before finding a energy cell. * Fixes IExternalPowerSink All implementations currently depend on the network demand being a valid source, which might not be true. Further it can cause the sink to iterate the network twice (demand and inject) and both again for simulate and modulate. Also it did not return the actual leftover amount instead of relying on the demand matching it. * Minor fixes related to removing nodes from a grid. The grid did remove IStackWatcherHost not IEnergyWatcherHost, this was fine for AE2 as only level emitters use it and they implement both. But not for potential addons. Also they would potentually not being removed as the are indexed by the gridnodes not the machine. Fixes #1004
This commit is contained in:
@@ -19,7 +19,9 @@
|
||||
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;
|
||||
@@ -131,14 +133,14 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
||||
}
|
||||
|
||||
@Override
|
||||
public double extractAEPower( final double amt, final Actionable mode, final Set<IEnergyGrid> seen )
|
||||
public Collection<IEnergyGridProvider> providers()
|
||||
{
|
||||
double acquiredPower = 0;
|
||||
Collection<IEnergyGridProvider> stuff = new LinkedList<>();
|
||||
|
||||
try
|
||||
{
|
||||
final IEnergyGrid eg = this.getProxy().getEnergy();
|
||||
acquiredPower += eg.extractAEPower( amt - acquiredPower, mode, seen );
|
||||
stuff.add( eg );
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
{
|
||||
@@ -148,7 +150,43 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
||||
try
|
||||
{
|
||||
final IEnergyGrid eg = this.outerProxy.getEnergy();
|
||||
acquiredPower += eg.extractAEPower( amt - acquiredPower, mode, seen );
|
||||
stuff.add( eg );
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
{
|
||||
// :P
|
||||
}
|
||||
|
||||
return stuff;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double extractProviderPower( final double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
@@ -159,15 +197,17 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
||||
}
|
||||
|
||||
@Override
|
||||
public double injectAEPower( final double amt, final Actionable mode, final Set<IEnergyGrid> seen )
|
||||
public double injectProviderPower( final double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
|
||||
{
|
||||
|
||||
double amount = amt;
|
||||
|
||||
try
|
||||
{
|
||||
final IEnergyGrid eg = this.getProxy().getEnergy();
|
||||
if( !seen.contains( eg ) )
|
||||
{
|
||||
return eg.injectAEPower( amt, mode, seen );
|
||||
amount = eg.injectProviderPower( amount, mode, seen );
|
||||
}
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
@@ -180,7 +220,7 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
||||
final IEnergyGrid eg = this.outerProxy.getEnergy();
|
||||
if( !seen.contains( eg ) )
|
||||
{
|
||||
return eg.injectAEPower( amt, mode, seen );
|
||||
amount = eg.injectProviderPower( amount, mode, seen );
|
||||
}
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
@@ -188,18 +228,21 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
||||
// :P
|
||||
}
|
||||
|
||||
return amt;
|
||||
return amount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getEnergyDemand( final double amt, final Set<IEnergyGrid> seen )
|
||||
public double getProviderEnergyDemand( final double amt, final Set<IEnergyGridProvider> seen )
|
||||
{
|
||||
double demand = 0;
|
||||
|
||||
try
|
||||
{
|
||||
final IEnergyGrid eg = this.getProxy().getEnergy();
|
||||
demand += eg.getEnergyDemand( amt - demand, seen );
|
||||
if( !seen.contains( eg ) )
|
||||
{
|
||||
demand += eg.getProviderEnergyDemand( amt - demand, seen );
|
||||
}
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
{
|
||||
@@ -209,7 +252,10 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
||||
try
|
||||
{
|
||||
final IEnergyGrid eg = this.outerProxy.getEnergy();
|
||||
demand += eg.getEnergyDemand( amt - demand, seen );
|
||||
if( !seen.contains( eg ) )
|
||||
{
|
||||
demand += eg.getProviderEnergyDemand( amt - demand, seen );
|
||||
}
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
{
|
||||
@@ -219,6 +265,18 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
||||
return demand;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getProviderStoredEnergy()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getProviderMaxEnergy()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPartModel getStaticModels()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user