diff --git a/simgear/timing/timestamp.cxx b/simgear/timing/timestamp.cxx index 7553d322..b12f7544 100644 --- a/simgear/timing/timestamp.cxx +++ b/simgear/timing/timestamp.cxx @@ -71,14 +71,31 @@ static clockid_t getClockId() } #endif +static bool qpc_init = false; +static LARGE_INTEGER s_frequency; +static BOOL s_use_qpc; void SGTimeStamp::stamp() { #ifdef _WIN32 - unsigned int t; - t = timeGetTime(); - _sec = t / 1000; - _nsec = ( t - ( _sec * 1000 ) ) * 1000 * 1000; + if (!qpc_init) { + s_use_qpc = QueryPerformanceFrequency(&s_frequency); + qpc_init = true; + } + if (qpc_init && s_use_qpc) { + LARGE_INTEGER now; + QueryPerformanceCounter(&now); + _sec = now.QuadPart / s_frequency.QuadPart; + _nsec = (1000000000LL * (now.QuadPart - _sec * s_frequency.QuadPart)) / s_frequency.QuadPart; + } + else { + unsigned int t; + + t = timeGetTime(); + _sec = t / 1000; + _nsec = (t - (_sec * 1000)) * 1000 * 1000; + } + #elif defined(_POSIX_TIMERS) && (0 < _POSIX_TIMERS) struct timespec ts; clock_gettime(getClockId(), &ts);