//FPSキープ //ただし、スキップは対応せず class FpsKeeper{ public: void Init(ref ss_timer_t timer,int fps); bool LastFpsChange(); int GetLastFps(); void Frame(); int GetWaitTime(); bool GetKeep(){return m_bKeep;} void SetKeep(bool keep){m_bKeep=keep;} private: ref ss_timer_t m_fpsMaster; ss_timer_t m_realTimer; ss_timming m_realOneSec; ss_timming m_FpsTimer; int m_nKeepingFps; int m_nLastFps; int m_nLastFrame; int m_nCountingFps; int m_nBitweenTime; bool m_bKeep; }; void FpsKeeper::Init(ref ss_timer_t timer,int fps){ m_fpsMaster<-timer; //1000ミリ秒で発火する。 m_realTimer.Start(); m_realOneSec.InitTimming(m_realTimer); m_realOneSec.StartInterval(1000); //17ミリ秒で発火する int fpsbetween=1000/fps; //if(1000 % fps!=0) fpsbetween++; m_nBitweenTime=fpsbetween; m_FpsTimer.InitTimming(m_realTimer); m_FpsTimer.StartInterval(m_nBitweenTime); m_bKeep=true; } bool FpsKeeper::LastFpsChange(){ if(m_realOneSec.Check()){ m_nLastFps=m_nCountingFps; m_nCountingFps=0; m_realOneSec.Start(); return true; } return false; } int FpsKeeper::GetLastFps(){ return m_nLastFps; } void FpsKeeper::Frame(){ m_nCountingFps++; m_FpsTimer.Start(); } int FpsKeeper::GetWaitTime(){ if(!m_bKeep) return 0;//キープしない場合はウェイトは零秒とする。 int keika=m_FpsTimer.GetTime(); keika=m_nBitweenTime-keika; if(keika < 0) return 0; return keika; }