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..6623378 100644 --- a/Telecom/network.cs +++ b/Telecom/network.cs @@ -165,19 +165,9 @@ 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_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(); } @@ -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 24eb216..302e6a9 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()); } @@ -55,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); @@ -68,6 +70,18 @@ private void NetworkInitializedNotify() { Log("CommNet Network Initialization fired."); } + private void AddPostUpdateHandler() { + ((RACommNetwork) RACommNetNetwork.Instance.CommNet).NetworkUpdateComplete.Add(PostUpdateHandler); + } + + private void PostUpdateHandler() { + double network_last_ut = ((RACommNetwork) RACommNetNetwork.Instance.CommNet).LastUpdateUT; + if (network_last_ut > last_update_ut_) { + do_refresh_ = true; + last_update_ut_ = network_last_ut; + } + } + private IEnumerator CreateNetwork() { while (RACommNetScenario.RACN == null || !CommNet.CommNetNetwork.Initialized) { yield return new UnityEngine.WaitForFixedUpdate(); @@ -180,7 +194,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_) { + do_refresh_ = false; // Unset now so that it can reset if RA updates while we're working. + network?.Refresh(); + } + network?.ConsumeElectricCharge(); } private void LateUpdate() { @@ -231,5 +250,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_; } }