From 57a6ea4d6aee4ec145a68d63ac46e37d6640c32a Mon Sep 17 00:00:00 2001 From: periodically-makes-puns Date: Fri, 13 Mar 2026 16:38:27 -0400 Subject: [PATCH 1/7] vgv optimisations, run once every RA update --- Telecom/RuntimeMetrics.cs | 6 +++--- Telecom/main_window.cs | 4 ++-- Telecom/network.cs | 4 ++-- Telecom/telecom.cs | 31 ++++++++++++++++++++++++++++++- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/Telecom/RuntimeMetrics.cs b/Telecom/RuntimeMetrics.cs index 80aac2f..51ce5db 100644 --- a/Telecom/RuntimeMetrics.cs +++ b/Telecom/RuntimeMetrics.cs @@ -1,9 +1,9 @@ namespace σκοπός { internal class RuntimeMetrics { public RuntimeMetrics() { } - public int num_fixed_update_iterations_ = 0; - public double fixed_update_runtime_ = 0; + public int num_iterations_ = 0; + public double total_runtime_ = 0; - public double AverageFixedUpdateRuntime => fixed_update_runtime_ / num_fixed_update_iterations_; + public double AverageRefreshRuntime => total_runtime_ / num_iterations_; } } diff --git a/Telecom/main_window.cs b/Telecom/main_window.cs index e2a0e09..a773516 100644 --- a/Telecom/main_window.cs +++ b/Telecom/main_window.cs @@ -37,8 +37,8 @@ protected override void RenderWindowContents(int window_id) { using (new UnityEngine.GUILayout.HorizontalScope()) { UnityEngine.GUILayout.Label($"Contracted connections: {telecom_.network.contracted_connections.Count}"); - UnityEngine.GUILayout.Label($"Fixed Updates: {telecom_.runtimeMetrics_.num_fixed_update_iterations_}"); - UnityEngine.GUILayout.Label($"Average Runtime: {telecom_.runtimeMetrics_.AverageFixedUpdateRuntime:F2} ms"); + UnityEngine.GUILayout.Label($"Total Runs: {telecom_.runtimeMetrics_.num_iterations_}"); + UnityEngine.GUILayout.Label($"Average Total Runtime: {telecom_.runtimeMetrics_.AverageRefreshRuntime:F2} ms"); } var inspected_connections = connection_inspectors_.Keys.ToArray(); diff --git a/Telecom/network.cs b/Telecom/network.cs index 6331681..dfd44a2 100644 --- a/Telecom/network.cs +++ b/Telecom/network.cs @@ -176,8 +176,8 @@ public void Refresh() { } } refresh_watch_.Stop(); - metrics.num_fixed_update_iterations_++; - metrics.fixed_update_runtime_ = refresh_watch_.Elapsed.TotalMilliseconds; + metrics.num_iterations_++; + metrics.total_runtime_ = refresh_watch_.Elapsed.TotalMilliseconds; UnityEngine.Profiling.Profiler.EndSample(); } diff --git a/Telecom/telecom.cs b/Telecom/telecom.cs index 24eb216..fcd0ec2 100644 --- a/Telecom/telecom.cs +++ b/Telecom/telecom.cs @@ -48,6 +48,7 @@ public void Start() { Log("Starting"); enabled = false; GameEvents.CommNet.OnNetworkInitialized.Add(NetworkInitializedNotify); + GameEvents.CommNet.OnNetworkInitialized.Add(AddPostUpdateHandler); GameEvents.Contract.onContractsLoaded.Add(NotifyContractsLoaded); StartCoroutine(CreateNetwork()); } @@ -68,6 +69,26 @@ private void NetworkInitializedNotify() { Log("CommNet Network Initialization fired."); } + private void AddPostUpdateHandler() { + if (RACommNetNetwork.Instance?.CommNet?.OnNetworkPostUpdate is Action) { + previous_on_network_post_update = RACommNetNetwork.Instance?.CommNet?.OnNetworkPostUpdate; + } + if (!(RACommNetNetwork.Instance?.CommNet is null)) { + RACommNetNetwork.Instance.CommNet.OnNetworkPostUpdate = PostUpdateHandler; + } + } + + private void PostUpdateHandler() { + //const double MIN_UPDATE_INTERVAL = 0.1; + if (previous_on_network_post_update is Action) previous_on_network_post_update(); + else { + double now = Planetarium.GetUniversalTime(); + if (last_refresh_ut <= now) { + do_refresh = true; + } + } + } + private IEnumerator CreateNetwork() { while (RACommNetScenario.RACN == null || !CommNet.CommNetNetwork.Initialized) { yield return new UnityEngine.WaitForFixedUpdate(); @@ -180,7 +201,12 @@ private void FixedUpdate() { // Time does not advance in the VAB, but after a revert, it is incorrectly stuck in the past. ut_ = Planetarium.GetUniversalTime(); } - network?.Refresh(); + + if (do_refresh) { + network?.Refresh(); + last_refresh_ut = ut_; + do_refresh = false; + } } private void LateUpdate() { @@ -231,5 +257,8 @@ link.b is RACommNode node_b && private KSP.UI.Screens.ApplicationLauncherButton toolbar_button_; internal RuntimeMetrics runtimeMetrics_ = new RuntimeMetrics(); + internal bool do_refresh = false; + private double last_refresh_ut = 0; + private Action previous_on_network_post_update = null; } } From ab03650d30dbed1b4e86253eb454bb838e8be0cd Mon Sep 17 00:00:00 2001 From: periodically-makes-puns Date: Sun, 15 Mar 2026 01:01:06 -0400 Subject: [PATCH 2/7] only update on RA hook --- Telecom/telecom.cs | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/Telecom/telecom.cs b/Telecom/telecom.cs index fcd0ec2..d8203ff 100644 --- a/Telecom/telecom.cs +++ b/Telecom/telecom.cs @@ -70,24 +70,15 @@ private void NetworkInitializedNotify() { } private void AddPostUpdateHandler() { - if (RACommNetNetwork.Instance?.CommNet?.OnNetworkPostUpdate is Action) { - previous_on_network_post_update = RACommNetNetwork.Instance?.CommNet?.OnNetworkPostUpdate; + ((RACommNetwork) RACommNetNetwork.Instance.CommNet).NetworkUpdateComplete.Add(PostUpdateHandler); } - if (!(RACommNetNetwork.Instance?.CommNet is null)) { - RACommNetNetwork.Instance.CommNet.OnNetworkPostUpdate = PostUpdateHandler; - } - } private void PostUpdateHandler() { - //const double MIN_UPDATE_INTERVAL = 0.1; - if (previous_on_network_post_update is Action) previous_on_network_post_update(); - else { - double now = Planetarium.GetUniversalTime(); - if (last_refresh_ut <= now) { + if ( ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT > last_update_ut) { do_refresh = true; + last_update_ut = ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT; } } - } private IEnumerator CreateNetwork() { while (RACommNetScenario.RACN == null || !CommNet.CommNetNetwork.Initialized) { @@ -203,9 +194,8 @@ private void FixedUpdate() { } if (do_refresh) { + do_refresh = false; // Unset now so that it can reset if RA updates while we're working. network?.Refresh(); - last_refresh_ut = ut_; - do_refresh = false; } } @@ -258,7 +248,6 @@ link.b is RACommNode node_b && internal RuntimeMetrics runtimeMetrics_ = new RuntimeMetrics(); internal bool do_refresh = false; - private double last_refresh_ut = 0; - private Action previous_on_network_post_update = null; + private double last_update_ut; } } From bc3166fef43ba17396730b0c4edb87095614460f Mon Sep 17 00:00:00 2001 From: periodically-makes-puns Date: Sun, 15 Mar 2026 01:25:46 -0400 Subject: [PATCH 3/7] indentation --- Telecom/telecom.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Telecom/telecom.cs b/Telecom/telecom.cs index d8203ff..46a9e00 100644 --- a/Telecom/telecom.cs +++ b/Telecom/telecom.cs @@ -75,10 +75,10 @@ private void AddPostUpdateHandler() { private void PostUpdateHandler() { if ( ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT > last_update_ut) { - do_refresh = true; + do_refresh = true; last_update_ut = ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT; - } } + } private IEnumerator CreateNetwork() { while (RACommNetScenario.RACN == null || !CommNet.CommNetNetwork.Initialized) { From b26c4ca8f04f785fe1ac8debc9a079f38ef45bf7 Mon Sep 17 00:00:00 2001 From: periodically-makes-puns Date: Sun, 15 Mar 2026 01:26:26 -0400 Subject: [PATCH 4/7] i'm too tired to notice whitespace issues --- Telecom/telecom.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telecom/telecom.cs b/Telecom/telecom.cs index 46a9e00..63c70d0 100644 --- a/Telecom/telecom.cs +++ b/Telecom/telecom.cs @@ -71,7 +71,7 @@ private void NetworkInitializedNotify() { private void AddPostUpdateHandler() { ((RACommNetwork) RACommNetNetwork.Instance.CommNet).NetworkUpdateComplete.Add(PostUpdateHandler); - } + } private void PostUpdateHandler() { if ( ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT > last_update_ut) { From baa60ca4ed4473083e1e26e02bff2f538811ee88 Mon Sep 17 00:00:00 2001 From: periodically-makes-puns Date: Sun, 15 Mar 2026 11:04:50 -0400 Subject: [PATCH 5/7] style oopsie, postincrement --- Telecom/network.cs | 2 +- Telecom/telecom.cs | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Telecom/network.cs b/Telecom/network.cs index dfd44a2..257cbd8 100644 --- a/Telecom/network.cs +++ b/Telecom/network.cs @@ -176,7 +176,7 @@ public void Refresh() { } } refresh_watch_.Stop(); - metrics.num_iterations_++; + ++metrics.num_iterations_; metrics.total_runtime_ = refresh_watch_.Elapsed.TotalMilliseconds; UnityEngine.Profiling.Profiler.EndSample(); } diff --git a/Telecom/telecom.cs b/Telecom/telecom.cs index 63c70d0..0ae7321 100644 --- a/Telecom/telecom.cs +++ b/Telecom/telecom.cs @@ -74,9 +74,9 @@ private void AddPostUpdateHandler() { } private void PostUpdateHandler() { - if ( ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT > last_update_ut) { - do_refresh = true; - last_update_ut = ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT; + if ( ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT > last_update_ut_) { + do_refresh_ = true; + last_update_ut_ = ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT; } } @@ -193,8 +193,8 @@ private void FixedUpdate() { ut_ = Planetarium.GetUniversalTime(); } - if (do_refresh) { - do_refresh = false; // Unset now so that it can reset if RA updates while we're working. + if (do_refresh_) { + do_refresh_ = false; // Unset now so that it can reset if RA updates while we're working. network?.Refresh(); } } @@ -247,7 +247,7 @@ link.b is RACommNode node_b && private KSP.UI.Screens.ApplicationLauncherButton toolbar_button_; internal RuntimeMetrics runtimeMetrics_ = new RuntimeMetrics(); - internal bool do_refresh = false; - private double last_update_ut; + internal bool do_refresh_ = false; + private double last_update_ut_; } } From 7d25d391f42446f3840eb424442743ba68236808 Mon Sep 17 00:00:00 2001 From: periodically-makes-puns Date: Sun, 29 Mar 2026 14:00:53 -0400 Subject: [PATCH 6/7] fix memory leak, cleanup last update time --- Telecom/telecom.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Telecom/telecom.cs b/Telecom/telecom.cs index 0ae7321..e7ea595 100644 --- a/Telecom/telecom.cs +++ b/Telecom/telecom.cs @@ -56,6 +56,7 @@ public void Start() { public void OnDestroy() { Log("Destroying"); GameEvents.CommNet.OnNetworkInitialized.Remove(NetworkInitializedNotify); + GameEvents.CommNet.OnNetworkInitialized.Remove(AddPostUpdateHandler); GameEvents.Contract.onAccepted.Remove(ReloadContractConnections); GameEvents.Contract.onFinished.Remove(ReloadContractConnections); GameEvents.Contract.onContractsLoaded.Remove(NotifyContractsLoaded); @@ -74,9 +75,10 @@ private void AddPostUpdateHandler() { } private void PostUpdateHandler() { - if ( ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT > last_update_ut_) { + double network_last_ut = ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT; + if (network_last_ut > last_update_ut_) { do_refresh_ = true; - last_update_ut_ = ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT; + last_update_ut_ = network_last_ut; } } From 9b6fc19df5f8abc58f8bb38c60dbe7c20eb2285d Mon Sep 17 00:00:00 2001 From: periodically-makes-puns Date: Sun, 29 Mar 2026 17:29:11 -0400 Subject: [PATCH 7/7] properly consume power --- Telecom/network.cs | 23 +++++++++++++---------- Telecom/telecom.cs | 1 + 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Telecom/network.cs b/Telecom/network.cs index 257cbd8..6623378 100644 --- a/Telecom/network.cs +++ b/Telecom/network.cs @@ -165,16 +165,6 @@ public void Refresh() { var metrics = Telecom.Instance.runtimeMetrics_; refresh_watch_.Start(); UpdateConnections(); - foreach (RealAntennaDigital antenna in routing_.usage.Transmitters()) { - if ((antenna?.ParentNode as RACommNode).ParentVessel is Vessel vessel) { - Kerbalism.ConsumeResource( - vessel, - "ElectricCharge", - // PowerDrawLinear is in mW, ElectricCharge is in kJ. - routing_.usage.TxPowerUsage(antenna) * antenna.PowerDrawLinear * 1e-6 * TimeWarp.fixedDeltaTime, - "Σκοπός telecom"); - } - } refresh_watch_.Stop(); ++metrics.num_iterations_; metrics.total_runtime_ = refresh_watch_.Elapsed.TotalMilliseconds; @@ -198,6 +188,19 @@ private void UpdateConnections() { } } + public void ConsumeElectricCharge() { + foreach (RealAntennaDigital antenna in routing_?.usage?.Transmitters()) { + if ((antenna?.ParentNode as RACommNode).ParentVessel is Vessel vessel) { + Kerbalism.ConsumeResource( + vessel, + "ElectricCharge", + // PowerDrawLinear is in mW, ElectricCharge is in kJ. + routing_.usage.TxPowerUsage(antenna) * antenna.PowerDrawLinear * 1e-6 * TimeWarp.fixedDeltaTime, + "Σκοπός telecom"); + } + } + } + internal void ReloadContractConnections() { connections_by_contract.Clear(); contracted_connections.Clear(); diff --git a/Telecom/telecom.cs b/Telecom/telecom.cs index e7ea595..302e6a9 100644 --- a/Telecom/telecom.cs +++ b/Telecom/telecom.cs @@ -199,6 +199,7 @@ private void FixedUpdate() { do_refresh_ = false; // Unset now so that it can reset if RA updates while we're working. network?.Refresh(); } + network?.ConsumeElectricCharge(); } private void LateUpdate() {