无论是在动画还是在一些游戏中,定时器总是必不可少的,游戏的帧数动画的播放等都离不开定时器的控制。这里以dx11龙书中提供的定时器为例,具体看看是怎么实现一个简单但精度高使用方便的定时器的。

  这个定时器使用的windows中的高精度计时函数QueryPerformanceCounter和QueryPerformanceFrequency

BOOL QueryPerformanceCounter(  LARGE_INTEGER* lpPerformanceCount );
BOOL QueryPerformanceFrequency( LARGE_INTEGER* lpFrequency );
 QueryPerformanceCounter函数以计数为单位,因为不同的机器中两次计数之间的差值可能不同,所以就需要QueryPerformanceFrequency函数 返回1s内计数的个数
__int64 countsPerSec;
QueryPerformanceFrequency((LARGE_INTEGER*)&countsPerSec);
m_secondsPerCount = 1.0 / countsPerSec;

  通过这样便可以得到系统两次计数之间的时间差,这是定时器把时间转换为秒的基准。

  下面看看这个定时器类GameTimer的具体实现

  GameTimer.h

 #ifndef GAMETIMER_H
#define GAMETIMER_H class GameTimer
{
public:
GameTimer();
float TotalTime() const;//返回定时器从计时开始到现在的总时间,不包括暂停时间
float DeltaTime() const;//返回本次计时与上次计时之间的时间差 void Reset();//重置
void Start();//暂停后恢复计时
void Stop();//暂停
void Tick();//计时一次,每一帧调用 private:
double m_secondsPerCount;//系统相关,系统两次计数之间的时间差,是定时器把时间转换为s的基准
double m_deltaTime;//距离上次计时的时间差 __int64 m_baseTime;//定时器开始工作的时间点
__int64 m_pausedTime;//暂停的总时间
__int64 m_stopTime;//暂停的开始时间
__int64 m_prevTime;//上次计时的时间点
__int64 m_currTime;//本次计时的时间点 bool m_isStopped;//是否暂停
}; #endif //GAMETIMER_H

  

  GameTimer.cpp

 #include "GameTimer.h"
#include <windows.h> GameTimer::GameTimer() : m_secondsPerCount(0.0), m_deltaTime(-1.0), m_baseTime(), m_pausedTime(),
m_prevTime(), m_currTime(), m_isStopped(false)
{
__int64 countsPerSec;
QueryPerformanceFrequency((LARGE_INTEGER*)&countsPerSec);
m_secondsPerCount = 1.0 / countsPerSec;
} float GameTimer::TotalTime() const
{
if (m_isStopped)
{
return static_cast<float>((m_stopTime - m_baseTime - m_pausedTime)*m_secondsPerCount);
}
else
{
return static_cast<float>((m_currTime - m_baseTime - m_pausedTime)*m_secondsPerCount);
}
} float GameTimer::DeltaTime() const
{
return static_cast<float>(m_deltaTime);
} void GameTimer::Tick()
{
if (m_isStopped)
{
m_deltaTime = 0.0;
return;
}
//得到这一帧的时间
__int64 currentTime;
QueryPerformanceCounter((LARGE_INTEGER*)&currentTime);
m_currTime = currentTime; //两次计时之间的时间
m_deltaTime = (m_currTime - m_prevTime) * m_secondsPerCount; m_prevTime = m_currTime; if (m_deltaTime < 0.0)
m_deltaTime = 0.0;
} void GameTimer::Reset()
{
__int64 currentTime;
QueryPerformanceCounter((LARGE_INTEGER*)(&currentTime)); m_baseTime = currentTime;
m_prevTime = currentTime;
m_stopTime = ;
m_isStopped = false;
} void GameTimer::Start()
{
__int64 startTime;
QueryPerformanceCounter((LARGE_INTEGER*)&startTime); if (m_isStopped)
{
//更新暂停的总时间
m_pausedTime += (startTime - m_stopTime); m_prevTime = startTime; //不再暂停
m_stopTime = ;
m_isStopped = false;
}
} void GameTimer::Stop()
{
if (!m_isStopped)
{
__int64 currentTime;
QueryPerformanceCounter((LARGE_INTEGER*)&currentTime); m_stopTime = currentTime;
m_isStopped = true;
}
}

  注释已经很详细了,类中函数和变量的作用也很明显。构造函数主要是获得根机器相关的变量,得到两次计数之间的时间差。

  定时第一次工作是应调用Reset()初始化,以后在每一帧中调用Tick()更新计时器的各种变量。通过TotalTime()和DeltaTime()可以得到相关时间信息,用Stop()和Start()

分别暂停和恢复定时器。

Directx11学习笔记【七】 游戏定时器的实现的更多相关文章

  1. Directx11学习笔记【九】 3D渲染管线

    原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...

  2. Directx11学习笔记【一】 最简单的windows程序HelloWin

    声明:本系列教程代码有部分来自dx11龙书及dx11游戏编程入门两本书,后面不再说明 首先,在vs2013中创建一个空的解决方案Dx11Demo,以后的工程都会放在这个解决方案下面.然后创建一个win ...

  3. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  4. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  5. Directx11学习笔记【二十二】 用高度图实现地形

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...

  6. Directx11学习笔记【二】 将HelloWin封装成类

    我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  8. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  9. muduo网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

  10. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

随机推荐

  1. 2014最新SSH框架面试题大收集

    (1)Hibernate工作原理及为什么要用? 原理:  1.读取并解析配置文件  2.读取并解析映射信息,创建SessionFactory  3.打开Sesssion  4.创建事务Transati ...

  2. ASA IPSEC VPN配置

    ASA-1配置 : Saved:ASA Version 8.0(2) !hostname ASA-1enable password 8Ry2YjIyt7RRXU24 encryptednames!in ...

  3. [置顶] C++学习书单

    关于C++的书太多了,很容易让人没有头绪.一直想整理下,把这些书列个书单出来,直到今天才动手.希望我的经验能给后来的初学者一点帮助. 1.<C++程序设计教程> 钱能 很多学校把这本书选做 ...

  4. hdu1535(最短路)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1535 题意:给你一个源点,让你从这里派发n个学生去其余的n-1个站点去邀请人们去CSS,然后再返回CS ...

  5. Android SDK r23

    SDK Tools Only Platform Package Size MD5 Checksum Windows 32 & 64-bit android-sdk_r23-windows.zi ...

  6. SVN与TortoiseSVN实战:补丁详解(转)

    硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  7. follow through

    follow through是什么意思_follow through的翻译_音标_读音_用法_例句 - 必应 Bing Dictionary Web Images Videos Maps News D ...

  8. 提供一个好用的Oracle Database 11g 下载地址

    提供一个好用的Oracle Database 11g 下载地址,在windows xp 操作系统下,测试通过. http://download.oracle.com/otn/nt/oracle11g/ ...

  9. UILabel iOS添加文本控件

    UILabel这是iOS控制,这是UIView子类,只有在UIView文字显示功能的基础上加入.UILabel还查看课程和UIView类别似     //1.创建一个视图对象     //2.配置视图 ...

  10. codeforces293E (树上点分治+树状数组)

    和poj1747相比起来,只不过是限制条件多了一维. 而多了这一维,所以需要用树状数组来维护,从而快速得到答案. 因为没注意传进树状数组函数的参数可能是<=0的,导致超时了好久. #pragma ...