diff --git a/OpenRa.Game/Clock.cs b/OpenRa.Game/Clock.cs index 10ea5ce435..806ae14b2b 100644 --- a/OpenRa.Game/Clock.cs +++ b/OpenRa.Game/Clock.cs @@ -1,109 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + namespace OpenRa.Game { - /// - /// Provides access to the current time, frame time, and frame rate. - /// public static class Clock { - /// - /// Performs one-time initialization for the clock service - /// + [DllImport("kernel32.dll")] + static extern bool QueryPerformanceCounter(out long value); + [DllImport("kernel32.dll")] + static extern bool QueryPerformanceFrequency(out long frequency); + + static int frameCount = 0; + static long frequency; + static long lastTime; + static double frameTime = 0; + static double totalTime = 0; + const int FramerateUpdateFrequency = 10; + static int lastFrameRate = 0; + static int lastFrameCount = 0; + static double nextFrameRateUpdateTime = 0; + static Clock() { - startTime = System.Environment.TickCount; - StartFrame(); + QueryPerformanceFrequency(out frequency); + QueryPerformanceCounter(out lastTime); } public static void Reset() { - frameCount = 0; - lastFrameCount = 0; - lastFrameRate = 0; - startTime = System.Environment.TickCount; - StartFrame(); + totalTime = 0; } - #region StartFrame - - /// - /// Indicates to the clock that a new frame has begun. This should be called exactly once per frame. - /// - public static void StartFrame() + public static void StartFrame() { - int ticks = System.Environment.TickCount - startTime; - frameStartTime = ticks / 1000.0; + long time; + QueryPerformanceCounter(out time); + + frameTime = (double)(time - lastTime) / (double)frequency; + totalTime += frameTime; + + lastTime = time; frameCount++; - if( Time > nextFrameRateUpdateTime ) + if (totalTime > nextFrameRateUpdateTime) { - // set next update time nextFrameRateUpdateTime += (1.0 / FramerateUpdateFrequency); - // average between last and current frame, to make spikes less severe - const int OldFramerateWeight = 10; + const int OldFramerateWeight = 20; const int NewFramerateWeight = 1; int newFrameRate = (frameCount - lastFrameCount) * FramerateUpdateFrequency; - lastFrameRate = (lastFrameRate * OldFramerateWeight + NewFramerateWeight * newFrameRate) / (OldFramerateWeight + NewFramerateWeight ); + lastFrameRate = (lastFrameRate * OldFramerateWeight + NewFramerateWeight * newFrameRate) + / (OldFramerateWeight + NewFramerateWeight); lastFrameCount = frameCount; } } - #endregion - - #region Private Implementation Details - - // number of framerate updates per second - private const int FramerateUpdateFrequency = 10; - - // the time at which the application started - private static int startTime; - // the time at which this frame began - private static double frameStartTime; - // total number of frames rendered - private static int frameCount = 0; - // next time to update fps count - private static double nextFrameRateUpdateTime = 0; - // frame count at most recent fps calculation - private static int lastFrameCount = 0; - // most recently calculated fps - private static int lastFrameRate = 0; - - #endregion - - #region Properties - - /// - /// The time the current frame started - /// - public static double Time + public static double Time { - get { return frameStartTime; } + get { return totalTime; } } - /// - /// The number of frames rendered since the engine started - /// - public static int FrameCount - { - get { return frameCount; } - } - - /// - /// The most recent frame-rate - /// public static int FrameRate { get { return lastFrameRate; } } - /// - /// The frame time corresponding to the most recent frame-rate - /// public static double FrameTime { - get { return 1.0 / lastFrameRate; } + get { return frameTime; } } - - #endregion } } diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 0822b4f850..695c5440c0 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -73,7 +73,7 @@ namespace OpenRa.Game float u0 = (float)s.origin.X / (float)s.sheet.bitmap.Width; float u1 = (float)(s.origin.X + s.size.Width) / (float)s.sheet.bitmap.Width; - return (1 - u) * u0 + u * u1; + return (u > 0) ? u1 : u0;// (1 - u) * u0 + u * u1; } float V(SheetRectangle s, float v) @@ -81,13 +81,13 @@ namespace OpenRa.Game float v0 = (float)s.origin.Y / (float)s.sheet.bitmap.Height; float v1 = (float)(s.origin.Y + s.size.Height) / (float)s.sheet.bitmap.Height; - return (1 - v) * v0 + v * v1; + return (v > 0) ? v1 : v0;// return (1 - v) * v0 + v * v1; } void LoadVertexBuffer() { Dictionary> indexMap = new Dictionary>(); - Vertex[] vertices = new Vertex[4 * 128 * 128];//map.Width * map.Height]; + Vertex[] vertices = new Vertex[4 * 128 * 128]; for( int i = map.XOffset; i < map.XOffset+ map.Width; i++ ) for (int j = map.YOffset; j < map.YOffset + map.Height; j++) @@ -131,7 +131,9 @@ namespace OpenRa.Game Visible = true; - device = GraphicsDevice.Create(this, ClientSize.Width, ClientSize.Height, true, false); + //device = GraphicsDevice.Create(this, ClientSize.Width, ClientSize.Height, true, false); + + device = GraphicsDevice.Create(this, 1280, 800, false, false); IniFile mapFile = new IniFile(File.OpenRead("../../../" + mapName)); map = new Map(mapFile); @@ -189,6 +191,22 @@ namespace OpenRa.Game } } + static T First(IEnumerable src) + { + IEnumerator enumerator = src.GetEnumerator(); + return enumerator.MoveNext() ? enumerator.Current : default(T); + } + + static T Nth(IEnumerable src, int n) + { + IEnumerator enumerator = src.GetEnumerator(); + bool ok = false; + while (n-- > 0) + ok = enumerator.MoveNext(); + + return ok ? enumerator.Current : default(T); + } + void Frame() { Clock.StartFrame(); @@ -225,6 +243,14 @@ namespace OpenRa.Game device.Present(); } + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + + if (e.KeyCode == Keys.C) + Clock.Reset(); + } + TileSet LoadTileSet(Map currentMap) { switch (currentMap.Theater.ToLowerInvariant())