00001 /* MAINTAINER: Martin */ 00002 00003 #ifndef _FPS_H 00004 #define _FPS_H 00005 00006 // TODO: implement better algorithm for fps computing 00007 class Fps 00008 { 00009 public: 00014 void init(unsigned int atime) 00015 { 00016 mFps = 0.0f; mFrameStamp = mFramesRendered = 0; 00017 mTimeStamp = atime; 00018 mUpdateTimeTreshold = DEFAULT_FPS_UPDATE_THRESHOLD; 00019 } 00020 00024 void onFrameRendered(void) 00025 { ++mFramesRendered; } 00026 00034 bool update(unsigned int atime) 00035 { 00036 // overflow check 00037 if (atime < mTimeStamp){ 00038 // skip one period 00039 mFrameStamp = mFramesRendered; 00040 mTimeStamp = atime; 00041 return false; 00042 } 00043 00044 atime -= mTimeStamp; // delta-time 00045 00046 if (atime >= getTreshold()) 00047 { 00048 // if fps overflew, return old fps count 00049 if (mFramesRendered >= mFrameStamp) 00050 mFps = float(1000 * (mFramesRendered - mFrameStamp)) / atime; 00051 mFrameStamp = mFramesRendered; 00052 mTimeStamp += atime; 00053 return true; 00054 } 00055 return false; 00056 } 00057 00062 unsigned int getTreshold(void) 00063 { return mUpdateTimeTreshold; } 00064 00069 void setTreshold(unsigned int treshold_ms) 00070 { mUpdateTimeTreshold = treshold_ms; } 00071 00076 unsigned int get(void) 00077 { return (unsigned int)mFps; } 00078 00079 private: 00080 unsigned int mFramesRendered; 00081 unsigned int mTimeStamp; 00082 unsigned int mFrameStamp; 00083 unsigned int mUpdateTimeTreshold; 00084 float mFps; 00085 00086 public: 00087 static const unsigned int DEFAULT_FPS_UPDATE_THRESHOLD = 100; 00088 }; 00089 /* 00090 class Fps2 00091 { 00092 public: 00093 Fps2(int bufferSize) 00094 : mTimeStamps(bufferSize) 00095 { 00096 clear(); 00097 } 00098 00099 void clear() 00100 { 00101 mCounter = mTimeStamps.size(); // how many buffer felds to fill 00102 mIndex = 0; // start at zero index 00103 mTotal = 0; // set sum of the buffer to zero 00104 mFps = 0; // reset fps 00105 } 00106 00107 void onFrameRendered(unsigned int atime) 00108 { 00109 int size = mTimeStamps.size(); 00110 int delta = atime - mTimeStamps[mIndex]; // delta time 00111 mIndex = (mIndex + 1) % size; // shift head to tail 00112 mTotal += delta; // add delta to total 00113 00114 // is the buffer full? 00115 if (!mCounter) 00116 mTotal -= mTimeStamps[mIndex]; // full -> subtract tail from total 00117 else { 00118 if (mCounter == size){ // the first time 00119 mTotal -= delta; 00120 } 00121 --mCounter; 00122 } 00123 00124 // set new time stamp (removes tail) and compute average fps 00125 mTimeStamps[mIndex] = atime; 00126 mFps = (mTotal > 0) ? (size - mCounter) / mTotal : 0; 00127 00128 mPreviousTime = atime; 00129 } 00130 00131 unsigned int get(void) 00132 { return (unsigned int)mFps; } 00133 00134 private: 00135 float mFps; ///< \brief the number of frames per second 00136 std::vector<unsigned int> mTimeStamps; 00137 int mIndex, mCounter, mPreviousTime; 00138 00139 }; 00140 */ 00141 00142 #endif
1.4.5