diff --git a/OpenRa.Game/Clock.cs b/OpenRa.Game/Clock.cs new file mode 100644 index 0000000000..10ea5ce435 --- /dev/null +++ b/OpenRa.Game/Clock.cs @@ -0,0 +1,109 @@ +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 + /// + static Clock() + { + startTime = System.Environment.TickCount; + StartFrame(); + } + + public static void Reset() + { + frameCount = 0; + lastFrameCount = 0; + lastFrameRate = 0; + startTime = System.Environment.TickCount; + StartFrame(); + } + + #region StartFrame + + /// + /// Indicates to the clock that a new frame has begun. This should be called exactly once per frame. + /// + public static void StartFrame() + { + int ticks = System.Environment.TickCount - startTime; + frameStartTime = ticks / 1000.0; + + frameCount++; + + if( Time > 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 NewFramerateWeight = 1; + int newFrameRate = (frameCount - lastFrameCount) * FramerateUpdateFrequency; + 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 + { + get { return frameStartTime; } + } + + /// + /// 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; } + } + + #endregion + } +} diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index c42c2866e6..0822b4f850 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -89,17 +89,17 @@ namespace OpenRa.Game Dictionary> indexMap = new Dictionary>(); Vertex[] vertices = new Vertex[4 * 128 * 128];//map.Width * map.Height]; - for( int i = 0; i < 128; i++ ) - for (int j = 0; j < 128; j++) + for( int i = map.XOffset; i < map.XOffset+ map.Width; i++ ) + for (int j = map.YOffset; j < map.YOffset + map.Height; j++) { SheetRectangle tile = tileMapping[map.MapTiles[i, j]]; ushort offset = (ushort)(4 * (i * 128 + j)); - vertices[offset] = new Vertex(24 * i, 24 * j, 0, U(tile,0), V(tile,0)); - vertices[offset + 1] = new Vertex(24 + 24 * i, 24 * j, 0, U(tile,1), V(tile,0)); - vertices[offset + 2] = new Vertex(24 * i, 24 + 24 * j, 0, U(tile,0), V(tile,1)); - vertices[offset + 3] = new Vertex(24 + 24 * i, 24 + 24 * j, 0, U(tile,1), V(tile,1)); + vertices[offset] = new Vertex(24 * i, 24 * j, 0, U(tile, 0), V(tile, 0)); + vertices[offset + 1] = new Vertex(24 + 24 * i, 24 * j, 0, U(tile, 1), V(tile, 0)); + vertices[offset + 2] = new Vertex(24 * i, 24 + 24 * j, 0, U(tile, 0), V(tile, 1)); + vertices[offset + 3] = new Vertex(24 + 24 * i, 24 + 24 * j, 0, U(tile, 1), V(tile, 1)); List indexList; if (!indexMap.TryGetValue(tile.sheet, out indexList)) @@ -149,6 +149,8 @@ namespace OpenRa.Game spriteHelper = new SpriteHelper(device); fontHelper = new FontHelper(device, "Tahoma", 10, false); + + Clock.Reset(); } internal void Run() @@ -182,15 +184,16 @@ namespace OpenRa.Game int dx = x1 - e.X; int dy = y1 - e.Y; scrollPos = oldPos; - scrollPos.X += (float)dx / 320.0f; - scrollPos.Y += (float)dy / 240.0f; + scrollPos.X += (float)dx / (ClientSize.Width / 2); + scrollPos.Y += (float)dy / (ClientSize.Height / 2); } } void Frame() { + Clock.StartFrame(); device.Begin(); - device.Clear( Color.Red.ToArgb(), Surfaces.Color ); + device.Clear( 0, Surfaces.Color ); vertexBuffer.Bind(0); @@ -215,7 +218,7 @@ namespace OpenRa.Game effect.End(); spriteHelper.Begin(); - fontHelper.Draw(spriteHelper, "fps: 1337", 0, 0, Color.White.ToArgb()); + fontHelper.Draw(spriteHelper, "fps: " + Clock.FrameRate, 0, 0, Color.White.ToArgb()); spriteHelper.End(); device.End(); diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 72ccc8e056..36794a7e63 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -39,6 +39,7 @@ + Form