如何从<chrono>获得int milli和float秒的持续时间?

Edd*_*223 75 c++ timer c++11 c++-chrono

我正在尝试使用计时库来定时器和持续时间.

我希望能够Duration frameStart;(从app开始)和a Duration frameDelta;(帧之间的时间)

我需要能够以frameDelta毫秒和浮点秒的形式获得持续时间.

你如何使用新的c ++ 11 <chrono>库做到这一点?我一直在努力和谷歌搜索(信息稀疏).代码是模板化的,需要特殊的演员和东西,我无法弄清楚如何正确使用这个库.

How*_*ant 127

这是你在找什么?

#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";
}
Run Code Online (Sandbox Code Playgroud)

对我来说打印出来:

6.5e-08s
0ms
Run Code Online (Sandbox Code Playgroud)

  • @rhalbersma:使用`auto`对于`d`来说没问题,因为`duration_cast <ms>`的结果是`ms`.然而,对于`fs``auto`是不合适的,因为`t1-t0`的结果具有类型`high_resolution_clock :: duration`,它不一定是与'duration <float>`相同的类型.例如,在我的系统上,它是`duration <long long,nano>`.因此,在该行上发生了从基于积分的"纳秒"到基于浮点数的"秒"的隐式转换,这只是因为目标类型是用`fsec`指定的. (21认同)
  • 为什么不在 `fs` 和 `d` 上使用 `auto`? (2认同)
  • 这是有用的信息。只是好奇:`auto fs = std::chrono::duration_cast&lt;fsec&gt;(t1 - t0);` 会是迂腐的矫枉过正吗? (2认同)
  • 请注意,在某些现实场景中(例如ms编译器和库),'high_resolution_clock'将错过微秒级的时间,此代码将吐出零, (2认同)

Jon*_*ely 14

我不知道"毫秒和浮点秒"是什么意思,但这应该给你一个想法:

#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';
}
Run Code Online (Sandbox Code Playgroud)


Bil*_*Kid 11

猜猜你要求的是什么.我假设毫秒帧计时器你正在寻找像下面这样的东西,

double mticks()
{
    struct timeval tv;
    gettimeofday(&tv, 0);
    return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000;
}
Run Code Online (Sandbox Code Playgroud)

但用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();
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 仅供参考——这是我回顾过的几十个例子中最清晰、最有用的例子。感谢您让永远令人困惑的计时功能变得易于理解。 (2认同)

Chr*_*rew 7

在使用显式类型化初始化程序惯用法的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';
}
Run Code Online (Sandbox Code Playgroud)