diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index a4c66b63ac..6ab2f8a78e 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -420,6 +420,12 @@ namespace OpenRA static bool quit; public static event Action OnQuit = () => { }; + static double idealFrameTime; + public static void SetIdealFrameTime(int fps) + { + idealFrameTime = 1.0 / fps; + } + internal static void Run() { if (Settings.Graphics.MaxFramerate < 1) @@ -428,19 +434,22 @@ namespace OpenRA Settings.Graphics.CapFramerate = false; } + SetIdealFrameTime(Settings.Graphics.MaxFramerate); + while (!quit) { - var idealFrameTime = 1.0 / Settings.Graphics.MaxFramerate; - var sw = new Stopwatch(); - - Tick(orderManager); - if (Settings.Graphics.CapFramerate) { - var waitTime = idealFrameTime - sw.ElapsedTime(); + var sw = new Stopwatch(); + + Tick(orderManager); + + var waitTime = Math.Min(idealFrameTime - sw.ElapsedTime(), 1); if (waitTime > 0) System.Threading.Thread.Sleep(TimeSpan.FromSeconds(waitTime)); } + else + Tick(orderManager); } OnQuit(); diff --git a/OpenRA.Mods.RA/Widgets/Logic/SettingsLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/SettingsLogic.cs index 66484c1624..7ca51a97e5 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/SettingsLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/SettingsLogic.cs @@ -156,6 +156,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic int.TryParse(frameLimitTextfield.Text, out fps); ds.MaxFramerate = fps.Clamp(20, 200); frameLimitTextfield.Text = ds.MaxFramerate.ToString(); + Game.SetIdealFrameTime(ds.MaxFramerate); }; frameLimitTextfield.OnEnterKey = () => { frameLimitTextfield.YieldKeyboardFocus(); return true; }; frameLimitTextfield.IsDisabled = () => !ds.CapFramerate; @@ -181,6 +182,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic gs.ShowShellmap = dgs.ShowShellmap; ds.CapFramerate = dds.CapFramerate; + Game.SetIdealFrameTime(ds.MaxFramerate); ds.MaxFramerate = dds.MaxFramerate; ds.Language = dds.Language; ds.Mode = dds.Mode;