我正在尝试使用chrono库进行计时器和时间段的操作。
我想要创建一个Duration frameStart;
(从应用程序启动开始的时间)以及一个Duration frameDelta;
(两帧之间的时间)
我需要能够以毫秒和浮点秒为单位获取frameDelta
持续时间。
如何在新的C++11 <chrono>
库中实现这一点?我一直在搜寻相关信息,但结果非常匮乏。这段代码具有很强的模板特性,还需要特殊的转换和处理,我无法正确使用这个库。
我正在尝试使用chrono库进行计时器和时间段的操作。
我想要创建一个Duration frameStart;
(从应用程序启动开始的时间)以及一个Duration frameDelta;
(两帧之间的时间)
我需要能够以毫秒和浮点秒为单位获取frameDelta
持续时间。
如何在新的C++11 <chrono>
库中实现这一点?我一直在搜寻相关信息,但结果非常匮乏。这段代码具有很强的模板特性,还需要特殊的转换和处理,我无法正确使用这个库。
这是你正在寻找的吗?
#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
fs
和 d
上使用 auto
? - TemplateRexd
,使用auto
是可以的,因为duration_cast<ms>
的结果是ms
类型。但对于变量fs
,使用auto
就不合适了,因为t1-t0
的结果是high_resolution_clock::duration
类型,这个类型不一定与duration<float>
相同。例如,在我的系统上它是duration<long long, nano>
类型。因此,在那一行中,从基于整数的nanoseconds
到基于浮点数的seconds
存在隐式转换,只是因为指定了目标类型为fsec
。 - Howard Hinnantauto fs = std :: chrono :: duration_cast <fsec>(t1 - t0);
是否过于追求细节? - TemplateRex根据你的询问,我猜测你需要毫秒帧计时器的功能。我假设你正在寻找类似以下功能的东西。
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();
}
希望这能有所帮助。start
声明为静态的?这样可能会导致编译器在其周围放置保护。你是不是想使用const
代替? - ZachB我不知道"毫秒和浮点秒"是什么意思,但这应该可以给你一个想法:
#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
类型? - K-ballo使用显式类型初始化惯用语在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';
}
duration_cast
?”这似乎是一个风格问题。你可以选择以几乎总是自动的方式编写代码,并明确地进行类型转换,或者不使用auto
并隐式地进行类型转换。你有权喜欢其中一种风格胜过另一种,但移除duration_cast
并不会使代码运行更快。 - Chris Drewfloat GetTimeFloat() {
return std::chrono::duration_cast<std::chrono::duration<float, std::milli>>(std::chrono::high_resolution_clock::now().time_since_epoch()).count() / 1000;
}
count
。 - K-balloduration_cast
进行类型转换。 - Jonathan Wakely