Parallelize BatteryRampPegSolver (#12351)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user