首页 > Personal > Game > 游戏引擎设计系列8-系统工具类
2018
09-25

游戏引擎设计系列8-系统工具类

引擎需要使用一些系统工具类,比如Clock、加密的CRC、GUID、Console、LogSystem、数学库、容器等等,其中比较重要的就是Clock了。
struct Clock {
enum Consts { QUEUE_MASK = 7 }; // 取值序列的大小
F32 m_fFixedFps;
F64 m_fTotalTimeElapsed;
F32 m_fFrameTimeElapsed;
F32 m_fFrameTimeLimit;
LARGE_INTEGER m_LastTickCount;
LARGE_INTEGER m_CpuFreq;
F64 m_fSecsPerTick;
F32 m_FrameTimeQueue[QUEUE_MASK+1];
U32 m_FrameTimeQueueId;

Clock() {
QueryPerformanceCounter(&m_LastTickCount); // 获取当前时钟帧数
QueryPerformanceFrequency(&m_CpuFreq); // 获取时钟频率
m_fSecsPerTick = 1.0 / (F64)m_CpuFreq.QuadPart; // 算出每帧的时间间隔

for (U32 i = 0; i < QUEUE_MASK + 1; i++) {
m_FrameTimeQueue[i] = 1.0f / 60.0f;
}
}

void Update() {
if (m_fFixedFps != 0.0f) {
/// 如果固定FPS则返回固定时间
m_fFrameTimeElapsed = 1.0f / m_fFixedFps;
} else {
LARGE_INTEGER llCurCount;
QueryPerformanceCounter(&llCurCount); // 获取当前时钟帧数
/// 计算这一帧消耗的时间间隔
m_fFrameTimeElapsed = m_fSecsPerTick * (llCurCount.QuadPart – m_LastTickCount.QuadPart);
m_LastTickCount = llCurCount; // 赋值当前时钟帧数
// 如果帧时间限制小于实际时间,则使用限制时间
m_fFrameTimeLimit < m_fFrameTimeElapsed ? m_fFrameTimeElapsed = m_fFrameTimeLimit : 0 ;
m_fFrameTimeElapsed < 0 ? m_fFrameTimeElapsed = m_fFrameTimeLimit : 0;
/// 将时间根据QUEUE_MASK数量平均化
F32 fTotalTime = m_fFrameTimeElapsed;
for (U32 i = 0; i < QUEUE_MASK + 1; i++) {
fTotalTime += m_FrameTimeQueue[i];
}
m_fFrameTimeElapsed = fTotalTime / (QUEUE_MASK + 1 + 1);
m_FrameTimeQueue[m_FrameTimeQueueId] = m_fFrameTimeElapsed;
m_FrameTimeQueueId = (m_FrameTimeQueueId + 1) & QUEUE_MASK;
}
m_fTotalTimeElapsed += m_fFrameTimeElapsed; // 计算消耗时间
}

F32 GetFrameTime() { return m_fFrameTimeElapsed; }
F64 GetTotalTime() { return m_fTotalTimeElapsed; }
void SetFixedFps(F32 fps) { m_fFixedFps = fps; }
F32 GetFixedFps() { return m_fFixedFps; }
void SetFrameTimeLimit(F32 fTimeLimit){ m_fFrameTimeLimit = fTimeLimit;}
F32 GetFrameTimeLimit() { return m_fFrameTimeLimit; }

};

最后编辑:
作者:wy182000
这个作者貌似有点懒,什么都没有留下。