Search code examples
c++c++11sdl

Can I replace SDL_GetTicks with std::chrono::high_resolution_clock?


Checking new stuff from C++, I have found the std::chrono library.

I am wondering if std::chrono::high_resolution_clock could be a good replacement for SDL_GetTicks?


Solution

  • The advantage of going with std::chrono::high_resolution_clock is to keep away from storing time points and time durations in a Uint32. The std::chrono library comes with a wide variety of std::chrono::durations that you should use instead. This will make code more readable, and less ambiguous:

    Uint32 t0 = SDL_GetTicks();
    // ...
    Uint32 t1 = SDL_GetTicks();
    // ...
    // Is t1 a time point or time duration?
    Uint32 d = t1 -t0;
    // What units does d have?
    

    vs:

    using namespace std::chrono;
    typedef high_resolution_clock Clock;
    Clock::time_point t0 = Clock::now();
    // ...
    Clock::time_point t1 = Clock::now();
    // ...
    // Is t1 has type time_point.  It can't be mistaken for a time duration.
    milliseconds d = t1 - t0;
    // d has type milliseconds
    

    The typed system for holding points in time and time durations has no overhead with respect to just storing things in a Uint32. Except maybe that things will be stored in an Int64 instead. But even that you could customize if you really wanted to:

    typedef duration<Uint32, milli> my_millisecond;
    

    You can inspect the precision of the high_resolution_clock with:

    cout << high_resolution_clock::period::num << '/' 
         << high_resolution_clock::period::den << '\n';