@@ -125,6 +125,10 @@ bool CCDirector::init(void)
125
125
// FPS
126
126
m_bDisplayFPS = false ;
127
127
m_nFrames = 0 ;
128
+ m_pszFPS = new char [10 ];
129
+ m_fExpectedFrameRate = 1 / m_dAnimationInterval;
130
+
131
+
128
132
129
133
// paused ?
130
134
m_bPaused = false ;
@@ -136,6 +140,7 @@ bool CCDirector::init(void)
136
140
m_bIsContentScaleSupported =false ;
137
141
138
142
m_pLastUpdate = new struct cc_timeval ();
143
+ m_pLastComputeTime = new struct cc_timeval ();
139
144
140
145
// create autorelease pool
141
146
NSPoolManager::getInstance ()->push();
@@ -162,8 +167,13 @@ CCDirector::~CCDirector(void)
162
167
NSPoolManager::getInstance ()->pop();
163
168
164
169
// delete m_pLastUpdate
165
- delete m_pLastUpdate;
166
- m_pLastUpdate = NULL ;
170
+ CCX_SAFE_DELETE (m_pLastUpdate);
171
+
172
+ // delete last compute time
173
+ CCX_SAFE_DELETE (m_pLastComputeTime);
174
+
175
+ // delete fps string
176
+ delete [] m_pszFPS;
167
177
}
168
178
169
179
void CCDirector::setGLDefaultValues (void )
@@ -181,11 +191,8 @@ void CCDirector::setGLDefaultValues(void)
181
191
#if CC_DIRECTOR_FAST_FPS
182
192
if (! m_pFPSLabel)
183
193
{
184
- // CCTexture2DPixelFormat currentFormat = CCTexture2D::defaultAlphaPixelFormat();
185
- // CCTexture2D::setDefaultAlphaPixelFormat(kCCTexture2DPixelFormat_RGBA4444);
186
194
m_pFPSLabel = CCLabel::labelWithString (" 00.0" , " XXX" , 24 );
187
195
m_pFPSLabel->retain ();
188
- /* CCTexture2D::setDefaultAlphaPixelFormat(currentFormat);*/
189
196
}
190
197
#endif
191
198
}
@@ -261,7 +268,7 @@ void CCDirector::calculateDeltaTime(void)
261
268
m_fDeltaTime = 0 ;
262
269
m_bNextDeltaTimeZero = false ;
263
270
}
264
- else
271
+ else
265
272
{
266
273
m_fDeltaTime = (now.tv_sec - m_pLastUpdate->tv_sec ) + (now.tv_usec - m_pLastUpdate->tv_usec ) / 1000000 .0f ;
267
274
m_fDeltaTime = MAX (0 , m_fDeltaTime);
@@ -656,8 +663,6 @@ void CCDirector::end(void)
656
663
657
664
void CCDirector::setNextScene (void )
658
665
{
659
- // bool runningIsTransition = dynamic_cast<CCTransitionScene *>(m_pRunningScene) != NULL;
660
- // bool newIsTransition = dynamic_cast<CCTransitionScene *>(m_pNextScene) != NULL;
661
666
ccSceneFlag runningSceneType = ccNormalScene;
662
667
ccSceneFlag newSceneType = m_pNextScene->getSceneType ();
663
668
@@ -691,7 +696,6 @@ void CCDirector::setNextScene(void)
691
696
m_pNextScene->retain ();
692
697
m_pNextScene = NULL ;
693
698
694
- /* if (! runningIsTransition && m_pRunningScene)*/
695
699
if (! (runningSceneType & ccTransitionScene) && m_pRunningScene)
696
700
{
697
701
m_pRunningScene->onEnter ();
@@ -754,24 +758,28 @@ void CCDirector::preMainLoop(void)
754
758
// updates the FPS every frame
755
759
void CCDirector::showFPS (void )
756
760
{
757
- ++m_nFrames ;
758
- m_fAccumDt += m_fDeltaTime ;
761
+ sprintf (m_pszFPS, " %.1f " , m_fFrameRate) ;
762
+ m_pFPSLabel-> setString (m_pszFPS) ;
759
763
760
- if (m_fAccumDt > CC_DIRECTOR_FPS_INTERVAL)
761
- {
764
+ m_pFPSLabel->draw ();
765
+ }
766
+ #endif // CC_DIRECTOR_FAST_FPS
767
+
768
+ void CCDirector::computeFrameRate ()
769
+ {
770
+ static bool bFirstTime = true ;
771
+ struct cc_timeval now;
772
+
773
+ CCTime::gettimeofdayCocos2d (&now, NULL );
774
+ if (! bFirstTime)
775
+ {
776
+ m_fAccumDt += ((now.tv_sec - m_pLastComputeTime->tv_sec ) + (now.tv_usec - m_pLastComputeTime->tv_usec ) / 1000000 .0f );
762
777
m_fFrameRate = m_nFrames / m_fAccumDt;
763
- m_nFrames = 0 ;
764
- m_fAccumDt = 0 ;
765
-
766
- char *str = new char [10 ];
767
- sprintf (str, " %.1f" , m_fFrameRate);
768
- m_pFPSLabel->setString (str);
769
- delete [] str;
770
778
}
771
779
772
- m_pFPSLabel->draw ();
780
+ bFirstTime = false ;
781
+ *m_pLastComputeTime = now;
773
782
}
774
- #endif // CC_DIRECTOR_FAST_FPS
775
783
776
784
#if CC_ENABLE_PROFILERS
777
785
void CCDirector::showProfilers ()
@@ -798,26 +806,23 @@ void CCDisplayLinkDirector::startAnimation(void)
798
806
}
799
807
800
808
m_bInvalid = false ;
801
-
802
- // approximate frame rate
803
- // assumes device refreshes at 60 fps
804
- // int frameInterval = (int) floor(animationInterval * 60.0f);
805
-
806
- // CCLOG(@"cocos2d: Frame interval: %d", frameInterval);
807
-
808
- // displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(preMainLoop:)];
809
- // [displayLink setFrameInterval:frameInterval];
810
- // [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
811
809
}
812
810
813
811
void CCDisplayLinkDirector::preMainLoop (void )
814
812
{
815
813
if (! m_bInvalid)
816
814
{
817
- drawScene ();
818
-
819
- // release the objects
820
- NSPoolManager::getInstance ()->pop();
815
+ // compute frame rate
816
+ computeFrameRate ();
817
+
818
+ if (m_fFrameRate < m_fExpectedFrameRate)
819
+ {
820
+ drawScene ();
821
+ ++m_nFrames;
822
+
823
+ // release the objects
824
+ NSPoolManager::getInstance ()->pop();
825
+ }
821
826
}
822
827
}
823
828
@@ -829,6 +834,7 @@ void CCDisplayLinkDirector::stopAnimation(void)
829
834
void CCDisplayLinkDirector::setAnimationInterval (double dValue)
830
835
{
831
836
m_dAnimationInterval = dValue;
837
+ m_fExpectedFrameRate = 1 / m_dAnimationInterval;
832
838
if (! m_bInvalid)
833
839
{
834
840
stopAnimation ();
0 commit comments