lugre_timer.cpp
Go to the documentation of this file.00001 #include "lugre_prefix.h"
00002 #include "lugre_timer.h"
00003
00004
00005
00006
00007 namespace Lugre {
00008
00009 size_t cTimer::miTimeSinceLastFrame = 1;
00010 size_t cTimer::miLastFrameTime = 0;
00011 size_t cTimer::miCurFrameNum = 0;
00012 float cTimer::mfPhysStepTime = 0.0;
00013
00014 cTimer::cTimer(const size_t iTime) { PROFILE
00015 miLastFrameTime = iTime;
00016
00017 }
00018
00019 cTimer::~cTimer() { PROFILE
00020
00021
00022
00023 }
00024
00025 void cTimer::StartFrame (const size_t iTime) { PROFILE
00026 ++miCurFrameNum;
00027 miTimeSinceLastFrame = iTime-miLastFrameTime;
00028 miLastFrameTime = iTime;
00029 mfPhysStepTime = float(miTimeSinceLastFrame)/1000.0;
00030
00031
00032 bool bRes;
00033 cTimerRegistration* pReg;
00034 std::multiset< cTimerRegistration*,cTimerRegistrationCompare>::iterator itorTimeouts;
00035 std::list< cTimerRegistration*>::iterator itorIntervals;
00036 std::list< cTimerRegistration*>::iterator itorFrameIntervals;
00037 std::list< cTimerRegistration*>* pFrameIntervalList;
00038
00039
00040 size_t iEraseCounter = 0;
00041 for (itorTimeouts=mlTimeouts.begin();itorTimeouts!=mlTimeouts.end();++itorTimeouts) {
00042 pReg = (*itorTimeouts);
00043 assert(pReg);
00044 if (pReg->miTime > iTime) break;
00045 pReg->Trigger(iTime,kListenerEvent_Timeout);
00046
00047 delete pReg;
00048 ++iEraseCounter;
00049 }
00050
00051 mlTimeouts.erase(mlTimeouts.begin(),itorTimeouts);
00052
00053
00054
00055 for (itorIntervals=mlIntervals.begin();itorIntervals!=mlIntervals.end();) {
00056
00057 pReg = (*itorIntervals);
00058 assert(pReg);
00059 if (pReg->miTime > iTime) {
00060
00061 ++itorIntervals;
00062 } else {
00063 bRes = pReg->Trigger(iTime,kListenerEvent_Interval);
00064 if (bRes) {
00065
00066 ++itorIntervals;
00067 } else {
00068
00069 mlIntervals.erase(itorIntervals++);
00070 }
00071 }
00072 }
00073
00074
00075 int i;
00076 for (i=0;i<mlFrameIntervals.size();++i) {
00077 if (!IsCurFrameInInterval(1<<i)) continue;
00078 pFrameIntervalList = mlFrameIntervals[i];
00079 if (!pFrameIntervalList) continue;
00080
00081 for (itorFrameIntervals=pFrameIntervalList->begin();itorFrameIntervals!=pFrameIntervalList->end();) {
00082 pReg = (*itorFrameIntervals);
00083 assert(pReg);
00084 bRes = pReg->Trigger(iTime,kListenerEvent_FrameInterval);
00085 if (bRes) {
00086
00087 ++itorFrameIntervals;
00088 } else {
00089
00090 pFrameIntervalList->erase(itorFrameIntervals++);
00091 }
00092 }
00093 }
00094 }
00095
00096
00097 bool cTimer::cTimerRegistration::Trigger (const size_t iCurTime,const size_t iEvent) { PROFILE
00098
00099 if (!*mpListener) return false;
00100 while (mbIsAlive && miTime <= iCurTime) {
00101 (*mpListener)->Listener_Notify(0,iEvent,static_cast<void*>(this),static_cast<void*>(miUserData));
00102 if (miInterval == 0 && miFrameInterval == 0) return false;
00103 miTime += miInterval;
00104 ++miIntervalCount;
00105 if (miFrameInterval > 0) break;
00106 } ;
00107 return mbIsAlive;
00108 }
00109
00111 cTimer::cTimerRegistration* cTimer::RegisterTimeoutListener (cListener* pListener,const size_t iTimeOut, void* userdata) { PROFILE
00112 cTimerRegistration* x = new cTimerRegistration(pListener,userdata,miLastFrameTime+((iTimeOut>0)?iTimeOut:1));
00113 mlTimeouts.insert(x);
00114 return x;
00115 }
00116
00117 cTimer::cTimerRegistration* cTimer::RegisterIntervalListener (cListener* pListener,const size_t iInterval, void* userdata) { PROFILE
00118 cTimerRegistration* x = new cTimerRegistration(pListener,userdata,miLastFrameTime+iInterval,iInterval);
00119 mlIntervals.push_front(x);
00120 return x;
00121 }
00122
00125 cTimer::cTimerRegistration* cTimer::RegisterFrameIntervalListener (cListener* pListener,const size_t iFrameIntervalExp,void* userdata) { PROFILE
00126 assert( iFrameIntervalExp <= kMaxFrameIntervalExp);
00127 if ( iFrameIntervalExp > kMaxFrameIntervalExp) { printf("cTimer::RegisterFrameIntervalListener illegal iFrameIntervalExp=%d\n",iFrameIntervalExp); return 0; }
00128 cTimerRegistration* x = new cTimerRegistration(pListener,userdata,miLastFrameTime,0,1<<iFrameIntervalExp);
00129
00130 size_t minsize = iFrameIntervalExp+1;
00131 if (mlFrameIntervals.size() < minsize)
00132 mlFrameIntervals.resize(minsize);
00133
00134 std::list< cTimerRegistration*>* pList = mlFrameIntervals[iFrameIntervalExp];
00135 if (!pList) { pList = new std::list< cTimerRegistration*>(); mlFrameIntervals[iFrameIntervalExp] = pList; }
00136 pList->push_front(x);
00137 return x;
00138 }
00139
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 };