#pragma once #include // 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( static_cast(m_currentTime.QuadPart - m_startTime.QuadPart) / static_cast(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( static_cast(m_currentTime.QuadPart - m_lastTime.QuadPart) / static_cast(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; };