This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

 

  Timer Class
  Submitted by



Here is a fairly simple timer class which gets used pretty often. It tries to use the Win32 High Performance Counter, and will default to the Windows Multimedia timer if it doesn't find that. The timer class keeps a member function pointer to the TimerUpdate function and invokes it in the public Update function which should be called once per game frame.


Currently browsing [Sys_time.zip] (1,630 bytes) - [Sys_time.h] - (1,425 bytes)


// COTD Entry submitted by Gaz Iqbal [devvoid@home.com]

#ifndef VOID_SYS_TIME
#define VOID_SYS_TIME

/* ==================================================== A Simple Timer class which tries to use the Win32 HighPerformance Timer. Will default to the Windows Multimedia timer if the High Performance Timer is not found.

I call the GetCurrent/Frame time functions from a pair of globally accessible functions which I define in namespace System{} to hide the implementation of CTime from all the other game code. ==================================================== */
class CTime { public:

CTime(); ~CTime();

void Init(); void Reset(); //Call this onces per game frame void Update();

//Access funcs inline const float & GetCurrentTime() const { return m_fCurrentTime; } inline const float & GetFrameTime() const { return m_fFrameTime; }

private:

typedef float (CTime::* TimeUpdateFunc) (); TimeUpdateFunc m_pfnUpdate;

float m_fBaseTime; float m_fLastTime; float m_fSecsPerTick;

float m_fCurrentTime; float m_fFrameTime;

//QueryPerformancesCounter related 64bit integers. //These are Microsoft specific, and will have to be changed for //different compilers. _int64 m_dTimerStart; _int64 m_dCurTime;

//One of these gets bound to the TimeUpdateFunc pointer float GetPerformanceCounterTime(); float GetMMTime(); };

#endif

Currently browsing [Sys_time.zip] (1,630 bytes) - [Sys_time.cpp] - (2,203 bytes)


// COTD Entry submitted by Gaz Iqbal [devvoid@home.com]

#include "Sys_hdr.h"
#include <mmsystem.h>
#include "Sys_time.h"

/* ===================================== Constructor/Destructor ===================================== */ CTime::CTime() : m_pfnUpdate(0), m_fBaseTime(0.0f), m_fLastTime(0.0f), m_fSecsPerTick(0.0f), m_fCurrentTime(0.0f), m_fFrameTime(0.0f), m_dTimerStart(0), m_dCurTime(0) { }

CTime::~CTime() { m_pfnUpdate = 0; }

/* ===================================== Initialize the timer ===================================== */ void CTime::Init() { _int64 dTicksPerSec =0;

if (QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER *>(&dTicksPerSec))) { // performance counter is available, use it instead of multimedia timer QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&m_dTimerStart)); m_fSecsPerTick = (1.0f)/(static_cast<float>(dTicksPerSec)); m_pfnUpdate = &CTime::GetPerformanceCounterTime; } else { //Use MM timer if unable to use the High Frequency timer m_dTimerStart = timeGetTime(); m_fSecsPerTick = 1.0f/1000.0f; m_pfnUpdate = &CTime::GetMMTime; } }

/* ================================================ Update time ================================================ */ void CTime::Update() { //The ->* operator binds the function pointer to the object pointed to by //the right hand pointer. which is THIS below m_fCurrentTime = (this->*m_pfnUpdate)() - m_fBaseTime; m_fFrameTime = m_fCurrentTime - m_fLastTime; m_fLastTime = m_fCurrentTime; }

/* ===================================== Reset the Timer ===================================== */ void CTime::Reset() { m_fBaseTime = (this->*m_pfnUpdate)(); m_fLastTime = m_fCurrentTime = m_fFrameTime = 0.0; }

/* ===================================== Time update funcs ===================================== */ float CTime::GetPerformanceCounterTime() { QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&m_dCurTime)); return (m_fSecsPerTick * (m_dCurTime - m_dTimerStart)); }

float CTime::GetMMTime() { return (m_fSecsPerTick * (timeGetTime()- m_dTimerStart)); }

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

 

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.