blob: 56bd398e9339a097a067b9ba57fea1c9cb5072ca [file] [log] [blame]
#pragma once
#include <wrl.h>
// Helper class for basic timing.
ref class BasicTimer sealed
{
public:
// Initializes internal timer values.
BasicTimer()
{
if (!QueryPerformanceFrequency(&m_frequency)) {
throw ref new Platform::FailureException();
}
Reset();
}
// Reset the timer to initial values.
void Reset()
{
Update();
m_startTime = m_currentTime;
m_total = 0.0f;
m_delta = 1.0f / 60.0f;
}
// Update the timer's internal values.
void Update()
{
if (!QueryPerformanceCounter(&m_currentTime)) {
throw ref new Platform::FailureException();
}
m_total = static_cast<float>(
static_cast<double>(m_currentTime.QuadPart - m_startTime.QuadPart) /
static_cast<double>(m_frequency.QuadPart));
if (m_lastTime.QuadPart == m_startTime.QuadPart) {
// If the timer was just reset, report a time delta equivalent to 60Hz
// frame time.
m_delta = 1.0f / 60.0f;
} else {
m_delta = static_cast<float>(
static_cast<double>(m_currentTime.QuadPart - m_lastTime.QuadPart) /
static_cast<double>(m_frequency.QuadPart));
}
m_lastTime = m_currentTime;
}
// Duration in seconds between the last call to Reset() and the last call to
// Update().
property float Total
{
float get() { return m_total; }
}
// Duration in seconds between the previous two calls to Update().
property float Delta
{
float get() { return m_delta; }
}
private:
LARGE_INTEGER m_frequency;
LARGE_INTEGER m_currentTime;
LARGE_INTEGER m_startTime;
LARGE_INTEGER m_lastTime;
float m_total;
float m_delta;
};