Changeset 120


Ignore:
Timestamp:
Aug 15, 2010, 6:56:07 PM (10 years ago)
Author:
sam
Message:

Improve the timer accuracy even more.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/timer.cpp

    r118 r120  
    4949    }
    5050
    51     float GetSeconds(bool update)
     51    float GetOrWait(float seconds)
    5252    {
    53         float ret;
     53        float ret, delta_time;
    5454#if defined __linux__
    5555        struct timeval tv;
    5656        gettimeofday(&tv, NULL);
    5757        ret = 1e-6f * (tv.tv_usec - tv0.tv_usec) + (tv.tv_sec - tv0.tv_sec);
    58         if (update)
     58        delta_time = seconds - ret;
     59        if (!seconds)
    5960            tv0 = tv;
     61        else if (delta_time > 0.0f)
     62            usleep((int)(delta_time * 1e6f));
    6063#elif defined _WIN32
    6164        LARGE_INTEGER cycles;
    6265        QueryPerformanceCounter(&cycles);
    6366        ret = seconds_per_cycle * (cycles.QuadPart - cycles0.QuadPart);
    64         if (update)
     67        delta_time = seconds - ret;
     68        if (!seconds)
    6569            cycles0 = cycles;
     70        else if (delta_time > 5e-4f) // FIXME: use native Win32 stuff
     71            SDL_Delay((int)(delta_time * 1e3f + 0.5f));
    6672#else
     73        /* The crappy SDL fallback */
    6774        Uint32 ticks = SDL_GetTicks();
    6875        ret = 1e-3f * (ticks - ticks0);
    69         if (update)
     76        delta_time = seconds - ret;
     77        if (!seconds)
    7078            ticks0 = ticks;
     79        else if (delta_time > 5e-4f)
     80            SDL_Delay((int)(delta_time * 1e3f + 0.5f));
    7181#endif
    7282        return ret;
    73     }
    74 
    75     void WaitSeconds(float seconds)
    76     {
    77 #if defined __linux__
    78         usleep((int)(seconds * 1000000.0f));
    79 #elif defined _WIN32
    80         /* FIXME: use native Win32 stuff */
    81         SDL_Delay((int)(seconds * 1000.0f + 0.5f));
    82 #else
    83         SDL_Delay((int)(seconds * 1000.0f + 0.5f));
    84 #endif
    8583    }
    8684
     
    111109float Timer::GetSeconds()
    112110{
    113     return data->GetSeconds(true);
     111    return data->GetOrWait(0.0f);
    114112}
    115113
    116114void Timer::WaitSeconds(float seconds)
    117115{
    118     float sleep = seconds - data->GetSeconds(false);
    119     if (sleep > 1e-4f)
    120         data->WaitSeconds(sleep);
     116    (void)data->GetOrWait(seconds);
    121117}
    122118
Note: See TracChangeset for help on using the changeset viewer.