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