git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1140 993157c7-ee19-0410-b2c4-bb4e9862e678
This commit is contained in:
@@ -1,109 +1,75 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace OpenRa.Game
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides access to the current time, frame time, and frame rate.
|
||||
/// </summary>
|
||||
public static class Clock
|
||||
{
|
||||
/// <summary>
|
||||
/// Performs one-time initialization for the clock service
|
||||
/// </summary>
|
||||
[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
|
||||
|
||||
/// <summary>
|
||||
/// Indicates to the clock that a new frame has begun. This should be called exactly once per frame.
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// The time the current frame started
|
||||
/// </summary>
|
||||
public static double Time
|
||||
public static double Time
|
||||
{
|
||||
get { return frameStartTime; }
|
||||
get { return totalTime; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The number of frames rendered since the engine started
|
||||
/// </summary>
|
||||
public static int FrameCount
|
||||
{
|
||||
get { return frameCount; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The most recent frame-rate
|
||||
/// </summary>
|
||||
public static int FrameRate
|
||||
{
|
||||
get { return lastFrameRate; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The frame time corresponding to the most recent frame-rate
|
||||
/// </summary>
|
||||
public static double FrameTime
|
||||
{
|
||||
get { return 1.0 / lastFrameRate; }
|
||||
get { return frameTime; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user