optimized frame limit sleep

* calculate idealFrameTime only when needed
* only create a new Stopwatch when needed
* disallow wait times > 1 second
This commit is contained in:
Matthias Mailänder
2014-01-11 09:14:31 +01:00
parent dd6b1f877d
commit 589f5297d9
2 changed files with 17 additions and 6 deletions

View File

@@ -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();

View File

@@ -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;