#include "CTimer.h"
//---------------------- default constructor------------------------------
//
//-------------------------------------------------------------------------
CTimer::CTimer(): m_FPS(0),
m_TimeElapsed(0.0f),
m_FrameTime(0),
m_LastTime(0),
m_PerfCountFreq(0)
{
//how many ticks per sec do we get
QueryPerformanceFrequency( (LARGE_INTEGER*)&m_PerfCountFreq);
m_TimeScale = 1.0f/m_PerfCountFreq;
}
//---------------------- constructor-------------------------------------
//
// use to specify FPS
//
//-------------------------------------------------------------------------
CTimer::CTimer(float fps): m_FPS(fps),
m_TimeElapsed(0.0f),
m_LastTime(0),
m_PerfCountFreq(0)
{
//how many ticks per sec do weget
QueryPerformanceFrequency( (LARGE_INTEGER*)&m_PerfCountFreq);
m_TimeScale =1.0f/m_PerfCountFreq;
//calculate ticks perframe
m_FrameTime = (LONGLONG)(m_PerfCountFreq /m_FPS);
}
//------------------------Start()-----------------------------------------
//
// call this immediately prior to game loop.Starts the timer (obviously!)
//
//--------------------------------------------------------------------------
void CTimer::Start()
{
//get the time
QueryPerformanceCounter( (LARGE_INTEGER*)&m_LastTime);
//update time to render next frame
m_NextTime = m_LastTime + m_FrameTime;
return;
}
//-------------------------ReadyForNextFrame()-------------------------------
//
// returns true if it is time to move on to thenext frame step. To be used if
// FPS is set.
//
//----------------------------------------------------------------------------
bool CTimer::ReadyForNextFrame()
{
if (!m_FPS)
{
MessageBox(NULL, "No FPS set in timer", "Doh!", 0);
returnfalse;
}
QueryPerformanceCounter( (LARGE_INTEGER*)&m_CurrentTime);
if (m_CurrentTime >m_NextTime)
{
m_TimeElapsed =(m_CurrentTime - m_LastTime) * m_TimeScale;
m_LastTime =m_CurrentTime;
//update time to render nextframe
m_NextTime = m_CurrentTime +m_FrameTime;
return true;
}
return false;
}
//--------------------------- TimeElapsed--------------------------------
//
// returns time elapsed since last call to thisfunction. Use in main
// when calculations are to be based on dt.
//
//-------------------------------------------------------------------------
double CTimer::TimeElapsed()
{
QueryPerformanceCounter( (LARGE_INTEGER*)&m_CurrentTime);
m_TimeElapsed = (m_CurrentTime -m_LastTime) * m_TimeScale;
m_LastTime =m_CurrentTime;
return m_TimeElapsed;
}
CTIMER.H
----------------
#ifndef CTIMER_H
#define CTIMER_H
//-----------------------------------------------------------------------
//
// Name: CTimer.h
//
// Author: Mat Buckland 2002
//
// Desc: Windows timer class for the book GameAI
// Programming with Neural Nets and GeneticAlgorithms.
//
//-----------------------------------------------------------------------
#include<windows.h>
class CTimer
{
private:
LONGLONG m_CurrentTime,
m_LastTime,
m_NextTime,
m_FrameTime,
m_PerfCountFreq;
double m_TimeElapsed,
m_TimeScale;
float m_FPS;
public:
//ctors
CTimer();
CTimer(float fps);
//whatdayaknow, this starts the timer
void Start();
//determines if enough time has passed to moveonto next frame
bool ReadyForNextFrame();
//only use this after a call to theabove.
double GetTimeElapsed(){returnm_TimeElapsed;}
double TimeElapsed();
};
#endif
本文介绍了一个用于游戏开发中的计时器类CTimer,该类可以确保在不同的机器运行速度下保持恒定的帧率(FPS)。通过使用Windows API的QueryPerformanceCounter和QueryPerformanceFrequency函数来获取高精度的时间戳,从而实现精确的时间测量。
2434

被折叠的 条评论
为什么被折叠?



