Я пытаюсь использовать библиотеку хронографов для таймеров и продолжительности.
Я хочу иметь Duration frameStart;
(при запуске приложения) и Duration frameDelta;
(время между кадрами)
Мне нужно получить frameDelta
продолжительность в миллисекундах и секундах с плавающей запятой.
Как вы это делаете с новыми <chrono>
библиотеками C ++ 11 ? Я работал над этим и гуглил (информация скудная). Код сильно шаблонен и требует специальных приведений и прочего, я не могу понять, как правильно использовать эту библиотеку.
count
его ...duration_cast
Ответы:
Это то, что вы ищете?
#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"; }
который для меня распечатывает:
6.5e-08s 0ms
источник
auto
наfs
иd
?auto
Было бы хорошо использоватьd
, потому что результатduration_cast<ms>
естьms
. Однако forfs
auto
не подходит, потому что результатt1-t0
имеет тип,high_resolution_clock::duration
который не обязательно совпадает с типомduration<float>
. Например, в моей системе это такduration<long long, nano>
. Таким образом, в этой строке происходит неявное преобразование от целочисленного к основанномуnanoseconds
на числах с плавающей запятойseconds
, только потому, что тип назначения указан сfsec
.auto fs = std::chrono::duration_cast<fsec>(t1 - t0);
бы педантичным излишеством?Догадайтесь, о чем вы просите. Я предполагаю, что с помощью миллисекундного таймера кадра вы ищете что-то, что действует следующим образом:
double mticks() { struct timeval tv; gettimeofday(&tv, 0); return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000; }
но
std::chrono
вместо этого использует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(); }
Надеюсь это поможет.
источник
Я не знаю, что означают «миллисекунды и секунды с плавающей запятой», но это должно дать вам представление:
#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'; }
источник
count
в качествеfloat
?В стиле AAA с использованием явно типизированной идиомы инициализатора :
#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'; }
источник