3D-Eye-Tracker/main/timer.h
2016-10-07 21:56:19 +09:00

104 lines
1.9 KiB
C++

#ifndef __PUPIL_TRACKER_TIMER_H__
#define __PUPIL_TRACKER_TIMER_H__
#include "high_resolution_timer.hpp"
namespace eye_tracker {
class timer
{
public:
timer() :
m_timer(),
m_elapsed(0.0), m_paused(false)
{
}
void pause()
{
if (!m_paused)
{
m_elapsed += m_timer.elapsed();
m_paused = true;
}
}
void resume()
{
if (m_paused)
{
m_timer.restart();
m_paused = false;
}
}
double elapsed() const
{
if (m_paused)
return m_elapsed;
else
return m_elapsed + m_timer.elapsed();
}
struct pause_guard
{
pause_guard(timer& t) : m_t(t)
{
m_t.pause();
}
~pause_guard()
{
m_t.resume();
}
operator bool() const { return false; }
timer& m_t;
};
protected:
boost::high_resolution_timer m_timer;
double m_elapsed;
bool m_paused;
};
#define PAUSE_TIMER(t) if(timer::pause_guard const& _timer_pause_guard_(t)) {} else
class FrameRateCounter
{
public:
FrameRateCounter()
:frame_count_(0), kSkipFrameCount(50), fps_(0.0) {
timer_.pause();
}
~FrameRateCounter(){}
double fps(){ return fps_; }
size_t frame_count() { return frame_count_; }
void count(){
if (frame_count_++ == kSkipFrameCount){
timer_.resume();/// Wait measuring time until the process gets stabilized
}
fps_ = (frame_count_ - kSkipFrameCount) / timer_.elapsed();
return;
}
protected:
// Local variables initialized at the constructor
double time_total;
size_t frame_count_;
double fps_;
// Local variables
timer timer_;
const size_t kSkipFrameCount;
private:
// Prevent copying
FrameRateCounter(const FrameRateCounter& other);
FrameRateCounter& operator=(const FrameRateCounter& rhs);
};
}
#endif // __PUPIL_TRACKER_TIMER_H__