]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Remove IoC resolves in BaseNetConnectorNodeGroup and friends (#20333)
authorLeon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Tue, 19 Sep 2023 12:44:49 +0000 (00:44 +1200)
committerGitHub <noreply@github.com>
Tue, 19 Sep 2023 12:44:49 +0000 (22:44 +1000)
Content.Server/Power/Components/ApcComponent.cs
Content.Server/Power/Components/BaseNetConnectorComponent.cs
Content.Server/Power/NodeGroups/ApcNet.cs
Content.Server/Power/NodeGroups/BaseNetConnectorNodeGroup.cs
Content.Server/Power/NodeGroups/BasePowerNet.cs
Content.Server/Power/NodeGroups/PowerNet.cs

index 2a31a6ba4d6b4dc27168b2294ee08f9b08f5c42a..8f74146b458c0f9c3308be58f098eb54df23797c 100644 (file)
@@ -37,13 +37,14 @@ public sealed partial class ApcComponent : BaseApcNetComponent
     public static TimeSpan VisualsChangeDelay = TimeSpan.FromSeconds(1);
 
     // TODO ECS power a little better!
+    // End the suffering
     protected override void AddSelfToNet(IApcNet apcNet)
     {
-        apcNet.AddApc(this);
+        apcNet.AddApc(Owner, this);
     }
 
     protected override void RemoveSelfFromNet(IApcNet apcNet)
     {
-        apcNet.RemoveApc(this);
+        apcNet.RemoveApc(Owner, this);
     }
 }
index 174c62a1df8f6ea5236a299dc1189545a0b819d4..551b5f3621f22b0fc7a46fde778c0f8d19c4647b 100644 (file)
@@ -5,6 +5,9 @@ using Content.Server.NodeContainer.NodeGroups;
 
 namespace Content.Server.Power.Components
 {
+    // TODO find a way to just remove this or turn it into one component.
+    // Component interface queries require enumerating over ALL of an entities components.
+    // So BaseNetConnectorNodeGroup<TNetType> is slow as shit.
     public interface IBaseNetConnectorComponent<in TNetType>
     {
         public TNetType? Net { set; }
index 32bb4e33b16186d1989e205e493e152cd8d95269..8c0b89b5071dec4e81826cd1a936c0596d630e16 100644 (file)
@@ -9,9 +9,9 @@ namespace Content.Server.Power.NodeGroups
 {
     public interface IApcNet : IBasePowerNet
     {
-        void AddApc(ApcComponent apc);
+        void AddApc(EntityUid uid, ApcComponent apc);
 
-        void RemoveApc(ApcComponent apc);
+        void RemoveApc(EntityUid uid, ApcComponent apc);
 
         void AddPowerProvider(ApcPowerProviderComponent provider);
 
@@ -24,8 +24,6 @@ namespace Content.Server.Power.NodeGroups
     [UsedImplicitly]
     public sealed partial class ApcNet : BasePowerNet<IApcNet>, IApcNet
     {
-        private PowerNetSystem? _powerNetSystem;
-
         [ViewVariables] public readonly List<ApcComponent> Apcs = new();
         [ViewVariables] public readonly List<ApcPowerProviderComponent> Providers = new();
 
@@ -39,30 +37,28 @@ namespace Content.Server.Power.NodeGroups
         public override void Initialize(Node sourceNode, IEntityManager entMan)
         {
             base.Initialize(sourceNode, entMan);
-
-            _powerNetSystem = entMan.EntitySysManager.GetEntitySystem<PowerNetSystem>();
-            _powerNetSystem.InitApcNet(this);
+            PowerNetSystem.InitApcNet(this);
         }
 
         public override void AfterRemake(IEnumerable<IGrouping<INodeGroup?, Node>> newGroups)
         {
             base.AfterRemake(newGroups);
 
-            _powerNetSystem?.DestroyApcNet(this);
+            PowerNetSystem?.DestroyApcNet(this);
         }
 
-        public void AddApc(ApcComponent apc)
+        public void AddApc(EntityUid uid, ApcComponent apc)
         {
-            if (IoCManager.Resolve<IEntityManager>().TryGetComponent(apc.Owner, out PowerNetworkBatteryComponent? netBattery))
+            if (EntMan.TryGetComponent(uid, out PowerNetworkBatteryComponent? netBattery))
                 netBattery.NetworkBattery.LinkedNetworkDischarging = default;
 
             QueueNetworkReconnect();
             Apcs.Add(apc);
         }
 
-        public void RemoveApc(ApcComponent apc)
+        public void RemoveApc(EntityUid uid, ApcComponent apc)
         {
-            if (IoCManager.Resolve<IEntityManager>().TryGetComponent(apc.Owner, out PowerNetworkBatteryComponent? netBattery))
+            if (EntMan.TryGetComponent(uid, out PowerNetworkBatteryComponent? netBattery))
                 netBattery.NetworkBattery.LinkedNetworkDischarging = default;
 
             QueueNetworkReconnect();
@@ -85,7 +81,7 @@ namespace Content.Server.Power.NodeGroups
 
         public override void QueueNetworkReconnect()
         {
-            _powerNetSystem?.QueueReconnectApcNet(this);
+            PowerNetSystem?.QueueReconnectApcNet(this);
         }
 
         protected override void SetNetConnectorNet(IBaseNetConnectorComponent<IApcNet> netConnectorComponent)
@@ -95,12 +91,9 @@ namespace Content.Server.Power.NodeGroups
 
         public override string? GetDebugData()
         {
-            if (_powerNetSystem == null)
-                return null;
-
             // This is just recycling the multi-tool examine.
 
-            var ps = _powerNetSystem.GetNetworkStatistics(NetworkNode);
+            var ps = PowerNetSystem.GetNetworkStatistics(NetworkNode);
 
             float storageRatio = ps.InStorageCurrent / Math.Max(ps.InStorageMax, 1.0f);
             float outStorageRatio = ps.OutStorageCurrent / Math.Max(ps.OutStorageMax, 1.0f);
index 97b585d36764cd983038e2e1f584fb82368c5a83..d70fbceed39e364bbe5bb8c3f167b1fa5d963c60 100644 (file)
@@ -6,29 +6,33 @@ namespace Content.Server.Power.NodeGroups
 {
     public abstract class BaseNetConnectorNodeGroup<TNetType> : BaseNodeGroup
     {
+        protected IEntityManager EntMan = default!;
+
+        public override void Initialize(Node sourceNode, IEntityManager entMan)
+        {
+            base.Initialize(sourceNode, entMan);
+            EntMan = entMan;
+        }
+
         public override void LoadNodes(List<Node> groupNodes)
         {
             base.LoadNodes(groupNodes);
-            var entManager = IoCManager.Resolve<IEntityManager>();
 
             foreach (var node in groupNodes)
             {
-                var newNetConnectorComponents = new List<IBaseNetConnectorComponent<TNetType>>();
-
-                foreach (var comp in entManager.GetComponents<IBaseNetConnectorComponent<TNetType>>(node.Owner))
+                // TODO POWER PERFORMANCE
+                // Replace this with TryComps or some other sane way of doing this, the current solution is awful.
+                // This allocates an array, copies ALL of an entities components over, and then iterates over them to
+                // yield any that implement the interface.
+                foreach (var comp in EntMan.GetComponents<IBaseNetConnectorComponent<TNetType>>(node.Owner))
                 {
                     if ((comp.NodeId == null ||
                          comp.NodeId == node.Name) &&
                         (NodeGroupID) comp.Voltage == node.NodeGroupID)
                     {
-                        newNetConnectorComponents.Add(comp);
+                        SetNetConnectorNet(comp);
                     }
                 }
-
-                foreach (var netConnector in newNetConnectorComponents)
-                {
-                    SetNetConnectorNet(netConnector);
-                }
             }
         }
 
index 295740d29eae6cb6fd274f8ca875cf72a6b8a370..99fc64ad486150ea3757ea24983fee43fbd2e952 100644 (file)
@@ -1,4 +1,6 @@
-using Content.Server.Power.Components;
+using Content.Server.NodeContainer.Nodes;
+using Content.Server.Power.Components;
+using Content.Server.Power.EntitySystems;
 using Content.Server.Power.Pow3r;
 using Robust.Shared.Utility;
 
@@ -9,10 +11,17 @@ public abstract class BasePowerNet<TNetType> : BaseNetConnectorNodeGroup<TNetTyp
 {
     [ViewVariables] public readonly List<PowerConsumerComponent> Consumers = new();
     [ViewVariables] public readonly List<PowerSupplierComponent> Suppliers = new();
+    public PowerNetSystem PowerNetSystem = default!;
 
     [ViewVariables]
     public PowerState.Network NetworkNode { get; } = new();
 
+    public override void Initialize(Node sourceNode, IEntityManager entMan)
+    {
+        base.Initialize(sourceNode, entMan);
+        PowerNetSystem = entMan.EntitySysManager.GetEntitySystem<PowerNetSystem>();
+    }
+
     public void AddConsumer(PowerConsumerComponent consumer)
     {
         DebugTools.Assert(consumer.NetworkLoad.LinkedNetwork == default);
index 0bbf11db723c92cb7621dfee94ee50011e382cee..edbc5661e248410ba9b60d50b1a92127a8ddf18f 100644 (file)
@@ -23,27 +23,20 @@ namespace Content.Server.Power.NodeGroups
     [UsedImplicitly]
     public sealed partial class PowerNet : BasePowerNet<IPowerNet>, IPowerNet
     {
-        private PowerNetSystem? _powerNetSystem;
-        private IEntityManager? _entMan;
-
         [ViewVariables] public readonly List<BatteryChargerComponent> Chargers = new();
         [ViewVariables] public readonly List<BatteryDischargerComponent> Dischargers = new();
 
         public override void Initialize(Node sourceNode, IEntityManager entMan)
         {
             base.Initialize(sourceNode, entMan);
-
-            _entMan = entMan;
-
-            _powerNetSystem = entMan.EntitySysManager.GetEntitySystem<PowerNetSystem>();
-            _powerNetSystem.InitPowerNet(this);
+            PowerNetSystem.InitPowerNet(this);
         }
 
         public override void AfterRemake(IEnumerable<IGrouping<INodeGroup?, Node>> newGroups)
         {
             base.AfterRemake(newGroups);
 
-            _powerNetSystem?.DestroyPowerNet(this);
+            PowerNetSystem?.DestroyPowerNet(this);
         }
 
         protected override void SetNetConnectorNet(IBaseNetConnectorComponent<IPowerNet> netConnectorComponent)
@@ -53,10 +46,10 @@ namespace Content.Server.Power.NodeGroups
 
         public void AddDischarger(BatteryDischargerComponent discharger)
         {
-            if (_entMan == null)
+            if (EntMan == null)
                 return;
 
-            var battery = _entMan.GetComponent<PowerNetworkBatteryComponent>(discharger.Owner);
+            var battery = EntMan.GetComponent<PowerNetworkBatteryComponent>(discharger.Owner);
             DebugTools.Assert(battery.NetworkBattery.LinkedNetworkDischarging == default);
             battery.NetworkBattery.LinkedNetworkDischarging = default;
             Dischargers.Add(discharger);
@@ -65,11 +58,11 @@ namespace Content.Server.Power.NodeGroups
 
         public void RemoveDischarger(BatteryDischargerComponent discharger)
         {
-            if (_entMan == null)
+            if (EntMan == null)
                 return;
 
             // Can be missing if the entity is being deleted, not a big deal.
-            if (_entMan.TryGetComponent(discharger.Owner, out PowerNetworkBatteryComponent? battery))
+            if (EntMan.TryGetComponent(discharger.Owner, out PowerNetworkBatteryComponent? battery))
             {
                 // Linked network can be default if it was re-connected twice in one tick.
                 DebugTools.Assert(battery.NetworkBattery.LinkedNetworkDischarging == default || battery.NetworkBattery.LinkedNetworkDischarging == NetworkNode.Id);
@@ -82,10 +75,10 @@ namespace Content.Server.Power.NodeGroups
 
         public void AddCharger(BatteryChargerComponent charger)
         {
-            if (_entMan == null)
+            if (EntMan == null)
                 return;
 
-            var battery = _entMan.GetComponent<PowerNetworkBatteryComponent>(charger.Owner);
+            var battery = EntMan.GetComponent<PowerNetworkBatteryComponent>(charger.Owner);
             DebugTools.Assert(battery.NetworkBattery.LinkedNetworkCharging == default);
             battery.NetworkBattery.LinkedNetworkCharging = default;
             Chargers.Add(charger);
@@ -94,11 +87,11 @@ namespace Content.Server.Power.NodeGroups
 
         public void RemoveCharger(BatteryChargerComponent charger)
         {
-            if (_entMan == null)
+            if (EntMan == null)
                 return;
 
             // Can be missing if the entity is being deleted, not a big deal.
-            if (_entMan.TryGetComponent(charger.Owner, out PowerNetworkBatteryComponent? battery))
+            if (EntMan.TryGetComponent(charger.Owner, out PowerNetworkBatteryComponent? battery))
             {
                 // Linked network can be default if it was re-connected twice in one tick.
                 DebugTools.Assert(battery.NetworkBattery.LinkedNetworkCharging == default || battery.NetworkBattery.LinkedNetworkCharging == NetworkNode.Id);
@@ -111,16 +104,16 @@ namespace Content.Server.Power.NodeGroups
 
         public override void QueueNetworkReconnect()
         {
-            _powerNetSystem?.QueueReconnectPowerNet(this);
+            PowerNetSystem?.QueueReconnectPowerNet(this);
         }
 
         public override string? GetDebugData()
         {
-            if (_powerNetSystem == null)
+            if (PowerNetSystem == null)
                 return null;
 
             // This is just recycling the multi-tool examine.
-            var ps = _powerNetSystem.GetNetworkStatistics(NetworkNode);
+            var ps = PowerNetSystem.GetNetworkStatistics(NetworkNode);
 
             float storageRatio = ps.InStorageCurrent / Math.Max(ps.InStorageMax, 1.0f);
             float outStorageRatio = ps.OutStorageCurrent / Math.Max(ps.OutStorageMax, 1.0f);