diff options
Diffstat (limited to 'Tests/VSWinStorePhone/Direct3DApp1/BasicTimer.h')
-rw-r--r-- | Tests/VSWinStorePhone/Direct3DApp1/BasicTimer.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/Tests/VSWinStorePhone/Direct3DApp1/BasicTimer.h b/Tests/VSWinStorePhone/Direct3DApp1/BasicTimer.h new file mode 100644 index 0000000..b58c77d --- /dev/null +++ b/Tests/VSWinStorePhone/Direct3DApp1/BasicTimer.h @@ -0,0 +1,76 @@ +#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; +}; |