//-------------------------------------------------------------------------------- /** \file Fps.h \brief CFps Class declaration file \version v1.1.1301.9071 \date 2013-01-07

Copyright (c) 2012-2013

*/ //---------------------------------------------------------------------------------- #ifndef FPS_H #define FPS_H #include #include #include #include //----------------------------------------------------------------- // CLock //----------------------------------------------------------------- /** \brief A lock class */ //----------------------------------------------------------------- class CLock { public: //! Constructor CLock(); //! Destructor ~CLock(); //! Try to enter the critical section, if success,returns true bool TryLock(); //! Enter the critical section (may block) void Lock(); //! Leave the critical section void Unlock(); private: //! no copy constructor CLock(const CLock&); //! no assignment operator CLock& operator=(const CLock&); protected: pthread_mutex_t m_mtxObject; }; //----------------------------------------------------------------- // AutoLock //----------------------------------------------------------------- class CAutoLock { CLock& m_Lock; public: CAutoLock(CLock& lock) : m_Lock(lock) { m_Lock.Lock(); } ~CAutoLock() { m_Lock.Unlock(); } private: CAutoLock& operator=(const CAutoLock&); CAutoLock(const CAutoLock&); }; //-------------------------------------------------------------------------------- /** \brief CDispTime implements cross-platform timing. CDispTime have the similar high timing accuracy with CPU clock in the windows , it's about 10ms in Linux. \author */ //---------------------------------------------------------------------------------- class CDispTime { public: ///Constructor CDispTime(void); ///Destructor ~CDispTime(void); ///Start the timer void Start(void); ///Restart timing again void Restart(void); ///Gets the time from Start or Restart double Elapsed(void) ; private: struct timespec tvBegin; struct timespec tvEnd; }; //-------------------------------------------------------------------------------- /** \file The CFps class is used to calculate the frame rate. CFps are thread safe. \author */ //---------------------------------------------------------------------------------- class CFps { public: ///Constructor CFps(void); ///Destructor ~CFps(void); ///Get the last frame rate double GetFps(void); ///Gets the total frame count inline size_t GetTotalFrameCount(void); ///Increase the number of frames void IncreaseFrameNum(void); ///Update frame rate void UpdateFps(void); ///Reset the timer to its original state inline void Reset(void); ///Reset frame rate inline void ResetFPS(void); ///Reset the total number of frames inline void ResetTotalFrameCount(void); private: size_t m_nFrameCount; ///< The number of frames accumulated from the last calculation double m_dBeginTime; ///< The time of a frame before the first frame (initially 0) double m_dEndTime; ///< The last frame of time double m_dFps; ///< The frame rate (frames per second) from the ratio of the number of frames to the time interval, double m_dCurrentFps; ///< The current frame rate may be predicted (frame / s) size_t m_nTotalFrameCount; ///< The number of frames accumulated CDispTime m_objTime; ///< Timer CLock m_objLock; ///< Protect the data lock }; //---------------------------------------------------------------------------------- /** \brief Gets the total frame count \param pFrame Current frame image */ //---------------------------------------------------------------------------------- inline size_t CFps::GetTotalFrameCount(void) { CAutoLock objAutoLock(m_objLock); return m_nTotalFrameCount; } //---------------------------------------------------------------------------------- /** \brief Reset frame rate \return void */ //---------------------------------------------------------------------------------- inline void CFps::ResetFPS(void) { CAutoLock objAutoLock(m_objLock); //modified by gomo 2016-04-12 m_nFrameCount = 0; m_dBeginTime = 0.0; m_dEndTime = 0.0; m_dFps = 0.0; m_dCurrentFps = 0.0; m_objTime.Start(); //Restart timer } //---------------------------------------------------------------------------------- /** \brief Reset the total number of frames \return void */ //---------------------------------------------------------------------------------- inline void CFps::ResetTotalFrameCount(void) { CAutoLock objAutoLock(m_objLock); m_nTotalFrameCount = 0; } //---------------------------------------------------------------------------------- /** \brief Reset the timer to its original state */ //---------------------------------------------------------------------------------- inline void CFps::Reset(void) { ResetFPS(); ResetTotalFrameCount(); } #endif //FPS_H