diff --git a/Compatible/Compatible.csproj b/Compatible/Compatible.csproj index fb5c6b4..54370f4 100644 --- a/Compatible/Compatible.csproj +++ b/Compatible/Compatible.csproj @@ -9,6 +9,6 @@ - + diff --git a/Qwilight/Compute/DefaultCompute.cs b/Qwilight/Compute/DefaultCompute.cs index af6f373..5514db4 100644 --- a/Qwilight/Compute/DefaultCompute.cs +++ b/Qwilight/Compute/DefaultCompute.cs @@ -2034,10 +2034,10 @@ switch (postableItem.VarietyValue) { case PostableItem.Variety.PositiveHitPoints: - HitPoints.TargetValue = Math.Min(HitPoints.TargetValue + millisLoopUnit / 1000.0 / (1000.0 / 60.0), 1.0); + HitPoints.TargetValue = Math.Min(HitPoints.TargetValue + millisLoopUnit / 1000.0 / (1000.0 / 60), 1.0); break; case PostableItem.Variety.NegativeHitPoints: - HitPoints.TargetValue = Math.Max(double.Epsilon, HitPoints.TargetValue - millisLoopUnit / 1000.0 / (1000.0 / 60.0)); + HitPoints.TargetValue = Math.Max(double.Epsilon, HitPoints.TargetValue - millisLoopUnit / 1000.0 / (1000.0 / 60)); break; } } diff --git a/Qwilight/QwilightComponent.cs b/Qwilight/QwilightComponent.cs index 470ef16..28d78b7 100644 --- a/Qwilight/QwilightComponent.cs +++ b/Qwilight/QwilightComponent.cs @@ -1,4 +1,5 @@ using CommandLine; +using Microsoft.Win32; using Qwilight.UIComponent; using Qwilight.Utilities; #if DEBUG @@ -8,6 +9,8 @@ using System.IO; using System.Reflection; using System.Text.RegularExpressions; +using System.Windows; +using System.Windows.Media.Animation; using Windows.Win32; using Windows.Win32.Graphics.Gdi; @@ -41,7 +44,6 @@ public static readonly JSON.AssetClient AssetsClientJSON; public static readonly double StandardUILoopMillis = 125.0; public static readonly double StandardLoopMillis = 1000.0 / 31; - public static readonly TimeSpan StandardFrametime = TimeSpan.FromMilliseconds(1000.0 / 60); public static readonly double StandardWaitMillis = 500.0; public static readonly int HeapCount = GC.MaxGeneration + 1; public static readonly HwMode DefaultHwMode; @@ -67,6 +69,8 @@ public static readonly string TVName = string.Empty; public static readonly string LANName = string.Empty; + public static TimeSpan StandardFrametime { get; set; } + public static string TaehuiNetDDNS { get; set; } public static string TaehuiNetFE { get; set; } @@ -209,6 +213,19 @@ catch { } + + SetStandardFrametime(); + SystemEvents.DisplaySettingsChanged += (sender, e) => SetStandardFrametime(); + + void SetStandardFrametime() + { + var framerate = Utility.GetMaxFramerate(); + Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), new FrameworkPropertyMetadata + { + DefaultValue = (int)framerate + }); + StandardFrametime = TimeSpan.FromMilliseconds(1000.0 / framerate); + } } } } \ No newline at end of file diff --git a/Qwilight/System/AudioSystem/AudioSystem.cs b/Qwilight/System/AudioSystem/AudioSystem.cs index e1d8229..7dd73f0 100644 --- a/Qwilight/System/AudioSystem/AudioSystem.cs +++ b/Qwilight/System/AudioSystem/AudioSystem.cs @@ -368,7 +368,7 @@ { _audioCSX.ExitWriteLock(); } - }, null, TimeSpan.Zero, QwilightComponent.StandardFrametime); + }, null, TimeSpan.Zero, TimeSpan.FromMilliseconds(1000.0 / 60)); } public virtual void Init() diff --git a/Qwilight/System/Configure/Configure.cs b/Qwilight/System/Configure/Configure.cs index a8388a3..2ccacb2 100644 --- a/Qwilight/System/Configure/Configure.cs +++ b/Qwilight/System/Configure/Configure.cs @@ -565,9 +565,7 @@ } else { - var rawHwMode = new DEVMODEW(); - PInvoke.EnumDisplaySettings(null, ENUM_DISPLAY_SETTINGS_MODE.ENUM_CURRENT_SETTINGS, ref rawHwMode); - NVLLFramerate = rawHwMode.dmDisplayFrequency; + NVLLFramerate = Utility.GetMaxFramerate(); } } } diff --git a/Qwilight/System/RGBSystem/RGBSystem.cs b/Qwilight/System/RGBSystem/RGBSystem.cs index 621a4a0..936e718 100644 --- a/Qwilight/System/RGBSystem/RGBSystem.cs +++ b/Qwilight/System/RGBSystem/RGBSystem.cs @@ -456,7 +456,7 @@ } else { - failedValue = Math.Max(0.0, failedValue - 60 / QwilightComponent.StandardWaitMillis); + failedValue = Math.Max(0.0, failedValue - 60 / 1000.0); } OnHandled(); diff --git a/Qwilight/Utilities/Utility.cs b/Qwilight/Utilities/Utility.cs index 5a1cb0b..0ac4284 100644 --- a/Qwilight/Utilities/Utility.cs +++ b/Qwilight/Utilities/Utility.cs @@ -575,7 +575,22 @@ public static long GetLazyGC() { - return Math.Max(0L, (Utility.GetWMI("SELECT FreePhysicalMemory FROM Win32_OperatingSystem").Select(o => 1000 * (long)(ulong)o["FreePhysicalMemory"]).Single() - QwilightComponent.RAM / 10) / 2 / 1000 / 1000); + return Math.Max(0L, (Utility.GetWMI("SELECT FreeVirtualMemory FROM Win32_OperatingSystem").Select(o => 1000 * (long)(ulong)o["FreeVirtualMemory"]).Single() - QwilightComponent.RAM / 10) / 2 / 1000 / 1000); + } + + public static uint GetMaxFramerate() + { + var framerate = 0U; + var rawHwMode = new DEVMODEW(); + var i = 0U; + while (PInvoke.EnumDisplaySettings(null, (ENUM_DISPLAY_SETTINGS_MODE)i++, ref rawHwMode)) + { + if (rawHwMode.Anonymous1.Anonymous2.dmDisplayFixedOutput == 0) + { + framerate = Math.Max(framerate, rawHwMode.dmDisplayFrequency); + } + } + return framerate; } } } \ No newline at end of file diff --git a/Qwilight/ViewModel/ConfigureViewModel.cs b/Qwilight/ViewModel/ConfigureViewModel.cs index 889832b..f278bf8 100644 --- a/Qwilight/ViewModel/ConfigureViewModel.cs +++ b/Qwilight/ViewModel/ConfigureViewModel.cs @@ -304,7 +304,7 @@ _fadingComputingHandler?.Stop(); _fadingComputingHandler = new(QwilightComponent.StandardFrametime, DispatcherPriority.Send, (sender, e) => { - Faint = Math.Max(0.125, Faint + Utility.GetMove(0.125, Faint, 1000.0 / 60)); + Faint = Math.Max(0.125, Faint + Utility.GetMove(0.125, Faint, QwilightComponent.StandardFrametime.TotalMilliseconds)); if (Faint == 0.125) { @@ -319,7 +319,7 @@ _fadingComputingHandler?.Stop(); _fadingComputingHandler = new(QwilightComponent.StandardFrametime, DispatcherPriority.Send, (sender, e) => { - Faint = Math.Min(Faint + Utility.GetMove(1.0, Faint, 1000.0 / 60), 1.0); + Faint = Math.Min(Faint + Utility.GetMove(1.0, Faint, QwilightComponent.StandardFrametime.TotalMilliseconds), 1.0); if (Faint == 1.0) {