Browse Source

Improve the timer accuracy even more.

legacy
Sam Hocevar sam 14 years ago
parent
commit
fa25646f80
1 changed files with 17 additions and 21 deletions
  1. +17
    -21
      src/timer.cpp

+ 17
- 21
src/timer.cpp View File

@@ -48,42 +48,40 @@ private:
#endif #endif
} }


float GetSeconds(bool update)
float GetOrWait(float seconds)
{ {
float ret;
float ret, delta_time;
#if defined __linux__ #if defined __linux__
struct timeval tv; struct timeval tv;
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
ret = 1e-6f * (tv.tv_usec - tv0.tv_usec) + (tv.tv_sec - tv0.tv_sec); ret = 1e-6f * (tv.tv_usec - tv0.tv_usec) + (tv.tv_sec - tv0.tv_sec);
if (update)
delta_time = seconds - ret;
if (!seconds)
tv0 = tv; tv0 = tv;
else if (delta_time > 0.0f)
usleep((int)(delta_time * 1e6f));
#elif defined _WIN32 #elif defined _WIN32
LARGE_INTEGER cycles; LARGE_INTEGER cycles;
QueryPerformanceCounter(&cycles); QueryPerformanceCounter(&cycles);
ret = seconds_per_cycle * (cycles.QuadPart - cycles0.QuadPart); ret = seconds_per_cycle * (cycles.QuadPart - cycles0.QuadPart);
if (update)
delta_time = seconds - ret;
if (!seconds)
cycles0 = cycles; cycles0 = cycles;
else if (delta_time > 5e-4f) // FIXME: use native Win32 stuff
SDL_Delay((int)(delta_time * 1e3f + 0.5f));
#else #else
/* The crappy SDL fallback */
Uint32 ticks = SDL_GetTicks(); Uint32 ticks = SDL_GetTicks();
ret = 1e-3f * (ticks - ticks0); ret = 1e-3f * (ticks - ticks0);
if (update)
delta_time = seconds - ret;
if (!seconds)
ticks0 = ticks; ticks0 = ticks;
else if (delta_time > 5e-4f)
SDL_Delay((int)(delta_time * 1e3f + 0.5f));
#endif #endif
return ret; return ret;
} }


void WaitSeconds(float seconds)
{
#if defined __linux__
usleep((int)(seconds * 1000000.0f));
#elif defined _WIN32
/* FIXME: use native Win32 stuff */
SDL_Delay((int)(seconds * 1000.0f + 0.5f));
#else
SDL_Delay((int)(seconds * 1000.0f + 0.5f));
#endif
}

#if defined __linux__ #if defined __linux__
struct timeval tv0; struct timeval tv0;
#elif defined _WIN32 #elif defined _WIN32
@@ -110,13 +108,11 @@ Timer::~Timer()


float Timer::GetSeconds() float Timer::GetSeconds()
{ {
return data->GetSeconds(true);
return data->GetOrWait(0.0f);
} }


void Timer::WaitSeconds(float seconds) void Timer::WaitSeconds(float seconds)
{ {
float sleep = seconds - data->GetSeconds(false);
if (sleep > 1e-4f)
data->WaitSeconds(sleep);
(void)data->GetOrWait(seconds);
} }



Loading…
Cancel
Save