Parallelize BatteryRampPegSolver (#12351)

This commit is contained in:
Leon Friedrich
2022-11-09 14:43:45 +13:00
committed by GitHub
parent 4a68db4eb2
commit eebb31493c
11 changed files with 546 additions and 250 deletions

View File

@@ -6,6 +6,7 @@ using Content.Server.Power.Pow3r;
using JetBrains.Annotations;
using Content.Shared.Power;
using Robust.Server.GameObjects;
using Robust.Shared.Threading;
namespace Content.Server.Power.EntitySystems
{
@@ -16,6 +17,7 @@ namespace Content.Server.Power.EntitySystems
public sealed class PowerNetSystem : EntitySystem
{
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly IParallelManager _parMan = default!;
private readonly PowerState _powerState = new();
private readonly HashSet<PowerNet> _powerNetReconnectQueue = new();
@@ -110,31 +112,37 @@ namespace Content.Server.Power.EntitySystems
public void InitPowerNet(PowerNet powerNet)
{
AllocNetwork(powerNet.NetworkNode);
_powerState.GroupedNets = null;
}
public void DestroyPowerNet(PowerNet powerNet)
{
_powerState.Networks.Free(powerNet.NetworkNode.Id);
_powerState.GroupedNets = null;
}
public void QueueReconnectPowerNet(PowerNet powerNet)
{
_powerNetReconnectQueue.Add(powerNet);
_powerState.GroupedNets = null;
}
public void InitApcNet(ApcNet apcNet)
{
AllocNetwork(apcNet.NetworkNode);
_powerState.GroupedNets = null;
}
public void DestroyApcNet(ApcNet apcNet)
{
_powerState.Networks.Free(apcNet.NetworkNode.Id);
_powerState.GroupedNets = null;
}
public void QueueReconnectApcNet(ApcNet apcNet)
{
_apcNetReconnectQueue.Add(apcNet);
_powerState.GroupedNets = null;
}
public PowerStatistics GetStatistics()
@@ -159,7 +167,7 @@ namespace Content.Server.Power.EntitySystems
// A full battery will still have the same max draw rate,
// but will likely have deliberately limited current draw rate.
float consumptionW = network.Loads.Sum(s => _powerState.Loads[s].DesiredPower);
consumptionW += network.BatteriesCharging.Sum(s => _powerState.Batteries[s].CurrentReceiving);
consumptionW += network.BatteryLoads.Sum(s => _powerState.Batteries[s].CurrentReceiving);
// This is interesting because LastMaxSupplySum seems to match LastAvailableSupplySum for some reason.
// I suspect it's accounting for current supply rather than theoretical supply.
@@ -172,7 +180,7 @@ namespace Content.Server.Power.EntitySystems
float supplyBatteriesW = 0.0f;
float storageCurrentJ = 0.0f;
float storageMaxJ = 0.0f;
foreach (var discharger in network.BatteriesDischarging)
foreach (var discharger in network.BatterySupplies)
{
var nb = _powerState.Batteries[discharger];
supplyBatteriesW += nb.CurrentSupply;
@@ -183,7 +191,7 @@ namespace Content.Server.Power.EntitySystems
// And charging
float outStorageCurrentJ = 0.0f;
float outStorageMaxJ = 0.0f;
foreach (var charger in network.BatteriesCharging)
foreach (var charger in network.BatteryLoads)
{
var nb = _powerState.Batteries[charger];
outStorageCurrentJ += nb.CurrentStorage;
@@ -191,7 +199,7 @@ namespace Content.Server.Power.EntitySystems
}
return new()
{
SupplyCurrent = network.LastMaxSupplySum,
SupplyCurrent = network.LastCombinedMaxSupply,
SupplyBatteries = supplyBatteriesW,
SupplyTheoretical = maxSupplyW,
Consumption = consumptionW,
@@ -212,7 +220,7 @@ namespace Content.Server.Power.EntitySystems
RaiseLocalEvent(new NetworkBatteryPreSync());
// Run power solver.
_solver.Tick(frameTime, _powerState);
_solver.Tick(frameTime, _powerState, _parMan.ParallelProcessCount);
// Synchronize batteries, the other way around.
RaiseLocalEvent(new NetworkBatteryPostSync());
@@ -332,8 +340,8 @@ namespace Content.Server.Power.EntitySystems
var netNode = net.NetworkNode;
netNode.Loads.Clear();
netNode.BatteriesDischarging.Clear();
netNode.BatteriesCharging.Clear();
netNode.BatterySupplies.Clear();
netNode.BatteryLoads.Clear();
netNode.Supplies.Clear();
foreach (var provider in net.Providers)
@@ -356,7 +364,7 @@ namespace Content.Server.Power.EntitySystems
foreach (var apc in net.Apcs)
{
var netBattery = batteryQuery.GetComponent(apc.Owner);
netNode.BatteriesDischarging.Add(netBattery.NetworkBattery.Id);
netNode.BatterySupplies.Add(netBattery.NetworkBattery.Id);
netBattery.NetworkBattery.LinkedNetworkDischarging = netNode.Id;
}
}
@@ -367,8 +375,8 @@ namespace Content.Server.Power.EntitySystems
netNode.Loads.Clear();
netNode.Supplies.Clear();
netNode.BatteriesCharging.Clear();
netNode.BatteriesDischarging.Clear();
netNode.BatteryLoads.Clear();
netNode.BatterySupplies.Clear();
foreach (var consumer in net.Consumers)
{
@@ -387,14 +395,14 @@ namespace Content.Server.Power.EntitySystems
foreach (var charger in net.Chargers)
{
var battery = batteryQuery.GetComponent(charger.Owner);
netNode.BatteriesCharging.Add(battery.NetworkBattery.Id);
netNode.BatteryLoads.Add(battery.NetworkBattery.Id);
battery.NetworkBattery.LinkedNetworkCharging = netNode.Id;
}
foreach (var discharger in net.Dischargers)
{
var battery = batteryQuery.GetComponent(discharger.Owner);
netNode.BatteriesDischarging.Add(battery.NetworkBattery.Id);
netNode.BatterySupplies.Add(battery.NetworkBattery.Id);
battery.NetworkBattery.LinkedNetworkDischarging = netNode.Id;
}
}