DragonNest/Common/EngineUtil/FrameSync.h

92 lines
1.6 KiB
C
Raw Normal View History

2024-12-19 09:48:26 +08:00
#pragma once
#include "Timer.h"
class CFrameSync:public TBoostMemoryPool<CFrameSync>
{
public:
CFrameSync();
~CFrameSync();
void Begin( int nSecureFrame );
void End();
void Pause();
void Resume();
void Reset();
void UpdateTime( int nDebugSecureCount = 0 );
bool CheckSync();
void CheckSecureFrameLoad( int nIgnoreFrame );
LOCAL_TIME GetMSTime();
float GetFps();
void SetTimeSpeed( float fSpeed, DWORD dwDelay = 0 );
protected:
LOCAL_TIME m_SystemTime;
LOCAL_TIME m_NextSyncTime;
LOCAL_TIME m_PrevUpdateTime;
/*
LARGE_INTEGER m_qpFreq;
LARGE_INTEGER m_qpBaseTime;
LARGE_INTEGER m_qpTime;
LARGE_INTEGER m_qpPrevTime;
*/
int m_nSecureFrame;
LOCAL_TIME m_SecureCount;
LOCAL_TIME m_PrevSecureCount;
bool m_bActivate;
bool m_bPause;
float m_fFPS;
float m_fTimeSpeed;
LOCAL_TIME m_LastModifySpeedTime;
LOCAL_TIME m_RevisionModifyTime;
DWORD m_dwModifySpeedDelay;
DWORD m_dwPovitTime;
};
class CFrameSkip
{
public:
CFrameSkip() { Clear(); }
virtual ~CFrameSkip() { }
//! <20>ʱ<EFBFBD>ȭ <20>ϴ<EFBFBD> <20>Լ<EFBFBD>..
void Clear()
{
SetFramePerSec( 60.0f );
m_fTimer = 0.0f;
}
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void SetFramePerSec( float fFps )
{
m_fSecPerFrame = 1.0f/fFps;
m_fTimer = 0.0f;
}
/*! Update(float dt) <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD> ȣ<><C8A3><EFBFBD>ɶ<EFBFBD>,
<EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ŭ<EFBFBD><EFBFBD> true<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. */
bool Update( float fDt )
{
m_fTimer += fDt;
if( m_fTimer < 0 )
return false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_fTimer -= m_fSecPerFrame;
return true;
}
//! <09><><EFBFBD><20><><EFBFBD><EFBFBD> <20><>ŵ <20>Ǿ<EFBFBD> <20>ȴٸ<C8B4> false <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
bool IsFrameSkip() { return (m_fTimer >= 0); }
protected:
float m_fTimer;
float m_fSecPerFrame;
};