Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c++

c++11

sdl

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?

like image 776
bcsanches Avatar asked Dec 27 '12 13:12

bcsanches


2 Answers

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';
like image 180
Howard Hinnant Avatar answered Sep 21 '22 12:09

Howard Hinnant


SDL_GetTicks returns milliseconds so it is totally possible to use std::chrono instead, but mind the units conversion necessary. It may not be as simple as SDL_GetTicks. Also, the starting point won't be the same.

like image 39
Lukior Avatar answered Sep 18 '22 12:09

Lukior