0

我正在编写图形引擎。我想控制我的帧速率和所有需要时间管理的任务。目前,我的计时器能够使用 clock() 方法获取当前时间(在程序执行开始时初始化)并计算经过时间。但我想将时间重置为零,而且 time.h 似乎不可能。有谁知道这样做的图书馆?

4

3 回答 3

0

您必须为此编写自己的计时器类。启动计时器时,您存储当前时间,当询问计时器已经过去了多少时间时,您再次查询当前时间,并将其与启动时间进行比较。您可以通过用当前时间覆盖开始时间来重置计时器。

您也可能不想使用clock(),因为它只测量处理器时间而不是挂钟时间。如果处理器忙于另一项任务(例如空闲任务),您的计时将关闭。请注意,C++在定时器方面非常糟糕。您必须使用特定于操作系统的功能,例如QueryPerformanceCounter在 Windows 上。

哦,对了,如果你使用 C++11 并且愿意并且能够忍受可怕的语法,你可以尝试chrono

于 2013-07-21T13:07:56.917 回答
0

助推计时器课程适合您。

这是升压计时器类。

class timer
{
 public:
  timer() { _start_time = std::clock(); } // postcondition: elapsed()==0
  // reset the timer
  void   restart() { _start_time = std::clock(); } // post: elapsed()==0
  double elapsed() const                  // return elapsed time in seconds
    { return  double(std::clock() - _start_time) / CLOCKS_PER_SEC; }

  double elapsed_max() const   // return estimated maximum value for elapsed()
  // Portability warning: elapsed_max() may return too high a value on systems
  // where std::clock_t overflows or resets at surprising values.
  {
    return (double((std::numeric_limits<std::clock_t>::max)())
       - double(_start_time)) / double(CLOCKS_PER_SEC); 
  }

  double elapsed_min() const            // return minimum value for elapsed()
   { return double(1)/double(CLOCKS_PER_SEC); }

 private:
  std::clock_t _start_time;
}; // timer

演示

#include <boost/timer.hpp>
#include <iostream>
#include <unistd.h>
#include <ctime>
#include <cmath>

using namespace boost;
using namespace std;

int main()
{
    timer t;
    cout << "max timespan:" << t.elapsed_max() << "s" << endl;
    cout << "min timespan:" << t.elapsed_min() << "s" << endl;

    // consume time
    for ( long i = 0; i < 100000000; ++i )
        std::sqrt(123.456L);

    cout << "now time elapsed:" << t.elapsed() << "s" << endl;

    // reset timer
    t.restart();
    // consume time
    for ( long i = 0; i < 100000000; ++i )
        std::sqrt(123.456L);

    cout << "now time elapsed:" << t.elapsed() << "s" << endl;

    return 0;
}

编译演示
g++ demo.c -o demo -lm

于 2013-08-22T02:28:25.413 回答
0

您是否偶然检查过 boost cpu 计时器?( http://www.boost.org/doc/libs/1_54_0/libs/timer/doc/cpu_timers.html )

它非常全面,它可以做什么,可能是使用时钟的一个很好的选择。

一个简单的示例包括放入boost::timer::auto_cpu_timer t;您的范围代码,当t超出范围时,它将为您捕获时间。

于 2013-07-22T18:58:30.670 回答