Próbuję użyć biblioteki chronograficznej dla timerów i czasów trwania.
Chcę móc mieć Duration frameStart;
(od początku aplikacji) i Duration frameDelta;
(czas między klatkami)
Muszę mieć frameDelta
czas trwania w milisekundach i sekundach zmiennoprzecinkowych.
Jak to zrobić z nowymi <chrono>
bibliotekami C ++ 11 ? Pracowałem nad tym i googlowałem (informacje są skąpe). Kod jest mocno szablonowy i wymaga specjalnych rzutów i innych rzeczy, nie mogę dowiedzieć się, jak poprawnie korzystać z tej biblioteki.
count
go ...duration_cast
Odpowiedzi:
Czy tego szukasz?
#include <chrono> #include <iostream> int main() { typedef std::chrono::high_resolution_clock Time; typedef std::chrono::milliseconds ms; typedef std::chrono::duration<float> fsec; auto t0 = Time::now(); auto t1 = Time::now(); fsec fs = t1 - t0; ms d = std::chrono::duration_cast<ms>(fs); std::cout << fs.count() << "s\n"; std::cout << d.count() << "ms\n"; }
który dla mnie drukuje:
6.5e-08s 0ms
źródło
auto
nafs
id
?auto
byłoby w porządkud
, ponieważ wynikduration_cast<ms>
isms
. Jednak forfs
auto
nie byłoby odpowiednie, ponieważ wynik funkcjit1-t0
has typehigh_resolution_clock::duration
niekoniecznie jest tego samego typu coduration<float>
. Na przykład w moim systemie jest toduration<long long, nano>
. W tym wierszu zachodzi więc niejawna konwersja z opartejnanoseconds
na całkach na zmiennoprzecinkowąseconds
, tylko dlatego, że typ docelowy jest określony za pomocąfsec
.auto fs = std::chrono::duration_cast<fsec>(t1 - t0);
byłaby pedantyczna przesada?Zgadnij, o co prosisz. Zakładam, że według licznika czasu w milisekundach szukasz czegoś, co działa tak, jak poniżej,
double mticks() { struct timeval tv; gettimeofday(&tv, 0); return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000; }
ale
std::chrono
zamiast tego używadouble mticks() { typedef std::chrono::high_resolution_clock clock; typedef std::chrono::duration<float, std::milli> duration; static clock::time_point start = clock::now(); duration elapsed = clock::now() - start; return elapsed.count(); }
Mam nadzieję że to pomoże.
źródło
Nie wiem, co oznacza „milisekundy i zmienne sekundy”, ale to powinno dać ci wyobrażenie:
#include <chrono> #include <thread> #include <iostream> int main() { auto then = std::chrono::system_clock::now(); std::this_thread::sleep_for(std::chrono::seconds(1)); auto now = std::chrono::system_clock::now(); auto dur = now - then; typedef std::chrono::duration<float> float_seconds; auto secs = std::chrono::duration_cast<float_seconds>(dur); std::cout << secs.count() << '\n'; }
źródło
count
jakofloat
?W stylu AAA przy użyciu jawnie wpisanego idiomu inicjatora :
#include <chrono> #include <iostream> int main(){ auto start = std::chrono::high_resolution_clock::now(); // Code to time here... auto end = std::chrono::high_resolution_clock::now(); auto dur = end - start; auto i_millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur); auto f_secs = std::chrono::duration_cast<std::chrono::duration<float>>(dur); std::cout << i_millis.count() << '\n'; std::cout << f_secs.count() << '\n'; }
źródło