mirror of https://github.com/axmolengine/axmol.git
fix the method of computing frame rate
This commit is contained in:
parent
2ba7ba409b
commit
992ad7e75d
|
@ -127,8 +127,8 @@ bool CCDirector::init(void)
|
||||||
m_nFrames = 0;
|
m_nFrames = 0;
|
||||||
m_pszFPS = new char[10];
|
m_pszFPS = new char[10];
|
||||||
m_fExpectedFrameRate = (ccTime)(1 / m_dAnimationInterval);
|
m_fExpectedFrameRate = (ccTime)(1 / m_dAnimationInterval);
|
||||||
|
m_fComputeFrameRateDeltaTime = 0;
|
||||||
|
m_pLastComputeFrameRate = new struct cc_timeval();
|
||||||
|
|
||||||
// paused ?
|
// paused ?
|
||||||
m_bPaused = false;
|
m_bPaused = false;
|
||||||
|
@ -140,7 +140,6 @@ bool CCDirector::init(void)
|
||||||
m_bIsContentScaleSupported =false;
|
m_bIsContentScaleSupported =false;
|
||||||
|
|
||||||
m_pLastUpdate = new struct cc_timeval();
|
m_pLastUpdate = new struct cc_timeval();
|
||||||
m_pLastComputeTime = new struct cc_timeval();
|
|
||||||
|
|
||||||
// create autorelease pool
|
// create autorelease pool
|
||||||
NSPoolManager::getInstance()->push();
|
NSPoolManager::getInstance()->push();
|
||||||
|
@ -166,7 +165,7 @@ CCDirector::~CCDirector(void)
|
||||||
CCX_SAFE_DELETE(m_pLastUpdate);
|
CCX_SAFE_DELETE(m_pLastUpdate);
|
||||||
|
|
||||||
// delete last compute time
|
// delete last compute time
|
||||||
CCX_SAFE_DELETE(m_pLastComputeTime);
|
CCX_SAFE_DELETE(m_pLastComputeFrameRate);
|
||||||
|
|
||||||
// delete fps string
|
// delete fps string
|
||||||
delete []m_pszFPS;
|
delete []m_pszFPS;
|
||||||
|
@ -773,20 +772,53 @@ void CCDirector::showFPS(void)
|
||||||
}
|
}
|
||||||
#endif // CC_DIRECTOR_FAST_FPS
|
#endif // CC_DIRECTOR_FAST_FPS
|
||||||
|
|
||||||
void CCDirector::computeFrameRate()
|
void CCDirector::calculateFramerateDeltaTime(void)
|
||||||
{
|
{
|
||||||
static bool bFirstTime = true;
|
|
||||||
struct cc_timeval now;
|
struct cc_timeval now;
|
||||||
|
|
||||||
CCTime::gettimeofdayCocos2d(&now, NULL);
|
if (CCTime::gettimeofdayCocos2d(&now, NULL) != 0)
|
||||||
if (! bFirstTime)
|
|
||||||
{
|
{
|
||||||
m_fAccumDt += ((now.tv_sec - m_pLastComputeTime->tv_sec) + (now.tv_usec - m_pLastComputeTime->tv_usec) / 1000000.0f);
|
CCLOG("error in gettimeofday");
|
||||||
m_fFrameRate = m_nFrames / m_fAccumDt;
|
m_fComputeFrameRateDeltaTime = 0;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bFirstTime = false;
|
m_fComputeFrameRateDeltaTime = (now.tv_sec - m_pLastComputeFrameRate->tv_sec) + (now.tv_usec - m_pLastComputeFrameRate->tv_usec) / 1000000.0f;
|
||||||
*m_pLastComputeTime = now;
|
m_fComputeFrameRateDeltaTime = MAX(0, m_fComputeFrameRateDeltaTime);
|
||||||
|
|
||||||
|
*m_pLastComputeFrameRate = now;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCDirector::computeFrameRate()
|
||||||
|
{
|
||||||
|
static bool bInvoked = true;
|
||||||
|
|
||||||
|
// compute delta time
|
||||||
|
calculateFramerateDeltaTime();
|
||||||
|
|
||||||
|
// only add frames if the director really draw the scene
|
||||||
|
if (bInvoked)
|
||||||
|
{
|
||||||
|
m_nFrames++;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_fAccumDt += m_fComputeFrameRateDeltaTime;
|
||||||
|
|
||||||
|
if (m_fAccumDt > CC_DIRECTOR_FPS_INTERVAL)
|
||||||
|
{
|
||||||
|
m_fFrameRate = m_nFrames / m_fAccumDt;
|
||||||
|
|
||||||
|
if (m_fFrameRate > m_fExpectedFrameRate)
|
||||||
|
{
|
||||||
|
bInvoked = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_nFrames = 0;
|
||||||
|
m_fAccumDt = 0;
|
||||||
|
bInvoked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CC_ENABLE_PROFILERS
|
#if CC_ENABLE_PROFILERS
|
||||||
|
@ -840,10 +872,10 @@ void CCDisplayLinkDirector::preMainLoop(void)
|
||||||
// compute frame rate
|
// compute frame rate
|
||||||
computeFrameRate();
|
computeFrameRate();
|
||||||
|
|
||||||
if (m_fFrameRate < m_fExpectedFrameRate)
|
// control frame rate
|
||||||
|
if (m_fFrameRate <= m_fExpectedFrameRate)
|
||||||
{
|
{
|
||||||
drawScene();
|
drawScene();
|
||||||
++m_nFrames;
|
|
||||||
|
|
||||||
// release the objects
|
// release the objects
|
||||||
NSPoolManager::getInstance()->pop();
|
NSPoolManager::getInstance()->pop();
|
||||||
|
|
|
@ -420,7 +420,7 @@ protected:
|
||||||
#endif // CC_DIRECTOR_FAST_FPS
|
#endif // CC_DIRECTOR_FAST_FPS
|
||||||
|
|
||||||
/** calculates delta time since last time it was called */
|
/** calculates delta time since last time it was called */
|
||||||
void calculateDeltaTime(void);
|
void calculateDeltaTime();
|
||||||
|
|
||||||
#if CC_ENABLE_PROFILERS
|
#if CC_ENABLE_PROFILERS
|
||||||
void showProfilers(void);
|
void showProfilers(void);
|
||||||
|
@ -432,7 +432,10 @@ protected:
|
||||||
void recalculateProjectionAndEAGLViewSize();
|
void recalculateProjectionAndEAGLViewSize();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// compute frame rate
|
||||||
void computeFrameRate(void);
|
void computeFrameRate(void);
|
||||||
|
// compute delta time between computing frame rate
|
||||||
|
void calculateFramerateDeltaTime(void);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/* The CCXEGLView, where everything is rendered */
|
/* The CCXEGLView, where everything is rendered */
|
||||||
|
@ -478,12 +481,14 @@ protected:
|
||||||
/* last time the main loop was updated */
|
/* last time the main loop was updated */
|
||||||
struct cc_timeval *m_pLastUpdate;
|
struct cc_timeval *m_pLastUpdate;
|
||||||
|
|
||||||
/* last time the frame fate is computed */
|
|
||||||
struct cc_timeval *m_pLastComputeTime;
|
|
||||||
|
|
||||||
/* delta time since last tick to main loop */
|
/* delta time since last tick to main loop */
|
||||||
ccTime m_fDeltaTime;
|
ccTime m_fDeltaTime;
|
||||||
|
|
||||||
|
/* last time the director compute frame rate */
|
||||||
|
struct cc_timeval *m_pLastComputeFrameRate;
|
||||||
|
/* delta time since last computing frame rate */
|
||||||
|
ccTime m_fComputeFrameRateDeltaTime;
|
||||||
|
|
||||||
/* whether or not the next delta time will be zero */
|
/* whether or not the next delta time will be zero */
|
||||||
bool m_bNextDeltaTimeZero;
|
bool m_bNextDeltaTimeZero;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue