Estoy intentando usar la biblioteca de crono para temporizadores y duraciones.
Quiero poder tener un Duration frameStart;
(desde el inicio de la aplicación) y un Duration frameDelta;
(tiempo entre cuadros)
Necesito poder obtener la frameDelta
duración en milisegundos y segundos flotantes.
¿Cómo se hace esto con las nuevas <chrono>
bibliotecas de c ++ 11 ? He estado trabajando en ello y buscando en Google (la información es escasa). El código tiene muchas plantillas y requiere moldes especiales y cosas, no puedo entender cómo usar esta biblioteca correctamente.
count
...duration_cast
Respuestas:
¿Es esto lo que estás buscando?
#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"; }
que para mí imprime:
6.5e-08s 0ms
fuente
auto
enfs
yd
?auto
estaría bien parad
, como resultado deduration_cast<ms>
isms
. Sin embargo, parafs
auto
no sería apropiado porque el resultado det1-t0
tiene un tipohigh_resolution_clock::duration
que no es necesariamente del mismo tipo queduration<float>
. Por ejemplo, en mi sistema lo esduration<long long, nano>
. Entonces, hay una conversión implícita de basadonanoseconds
en integral a basado en flotanteseconds
en esa línea, solo porque el tipo de destino se especifica confsec
.auto fs = std::chrono::duration_cast<fsec>(t1 - t0);
una exageración pedante?Adivinando qué es lo que estás pidiendo. Supongo que, por un temporizador de fotogramas de milisegundos, está buscando algo que actúe como lo siguiente,
double mticks() { struct timeval tv; gettimeofday(&tv, 0); return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000; }
pero usa en su
std::chrono
lugar,double 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(); }
Espero que esto ayude.
fuente
No sé qué significa "milisegundos y segundos flotantes", pero esto debería darte una idea:
#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'; }
fuente
count
como unfloat
?En estilo AAA usando el idioma inicializador escrito explícitamente :
#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'; }
fuente