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