(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~)
无论在游戏还是简单的动画程序当中,定时器是一个必不可少的元素,用来正确地控制游戏帧数、动画的播放。最简单的实现定时器的方法通过在主循环中定义两个静态计时用的变量即可实现。但在学习过程中,定时器的使用相当频繁,因此设计一个具备基本功能的方便使用的定时器类很有必要。这次就来创建一个简单但精度很高的定时器。
这个定时器支持暂时、开始、重置等基本操作,程序中每一帧调用一次计数,并随时返回距离上一次计数之间的差值。这个差值就是控制游戏、动画更新的最重要的数据。
这个定时器用到了Windows中高精度的计时函数:QueryPerformanceCounter和QueryPerformanceFrequency,原型如下:
BOOL QueryPerformanceCounter( LARGE_INTEGER* lpPerformanceCount );
BOOL QueryPerformanceFrequency( LARGE_INTEGER* lpFrequency );
这个定时函数以计数为单位,不同的机器两次计数之间的时间差可能不一样,因此有了第二个函数,返回一秒内计数的个数,求倒数即是两次计数之间的时间差(秒)。第个函数返回一个长整型数,通过传递参数地址来获得。详细说明参见MSDN,参考该定时器类的实现也可以很好的理解它们的使用。
下面是这个定时器的类定义:
class Timer
{
public:
Timer();
float TotalTime() const; //返回定时器从开始计时到现在的总时间(不包含暂停时间),单位:秒
float DeltaTime() const; //返回本次计时与上次计时之间的时间差,单位:秒
void Start(); //暂停后恢复计时
void Stop(); //暂停
void Reset(); //重置,开始计时,定时器开始工作时调用
void Tick(); //计时一次,每一帧调用一次
private:
float m_secsPerCount; //系统有关,两个系统计数器之间的时间差值,单位:秒
//这个变量是定时器把时间单位转换为“秒”的基准
float m_deltaTime; //距离上次计时之间的时间差,单位:秒
__int64 m_baseTime; //定时器开始工作的起始时间点
__int64 m_stopTime; //如果当前为暂停状态,即指暂时的起始时刻
__int64 m_pausedTime; //暂停的总时间累计
__int64 m_currTime; //本次计时的时间点
__int64 m_prevTime; //上次计时的时间点
bool m_stopped; //是否暂停
};
注释已经十分详细,应该很容易明白各成员函数及变量的作用。
在构造函数中,主要任务是获得跟机器相关的变量,及m_secsPerCount,相临两次计数之间的时间差,以秒为单位。
在定时器开始工作前,需要先调用Reset,重置定时器,使定时器处于相应的工作状态,且设置好起始的参数。
其次,在程序每一帧中调用Tick来计时,更新定时器。
然后可以通过调用如TotalTime、DeltaTime函数来获得相关的时间值。其中DeltaTime()是最重要的函数,其返回的时间值是更新游戏每一帧及动画的核心参数。
通过调用Stop和Start来暂停和恢复定时器。
该定时器设计设计就这么简单,各成员函数的定义及详细的注释见源代码,通过源代码也可以更深入地理解用到的两个Windows定时函数。
定时器源代码
分享到:
相关推荐
经典d3d11游戏编程入门,作者Allen Sherrod和Wendy Jones,中英文高清pdf附加随书源码
D3D11游戏编程,XNAMath介绍,XMMATRIX部分示例代码
【D3D11游戏编程】中XNAMath介绍,XMVECTOR部分示例代码。
【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3D11 最新HOOK 源码支持X86_X64 【C++】D3...
2、D3D11利用D3D9传入的HANDLE使用OpenSharedResource来打开句柄实现D3D9到D3D11的数据传递 需要的库 1、NVAPI 安装完成后需要运行NVIDIA Capture SDK\bin目录下的NvFBCEnable.exe使能NVFBC抓屏 2、DXSDK_Jun10 坑...
对ID3D11Texture2D实现颜色填充(对D3D11实现IDirect3DDevice9::ColorFill效果) 运行环境VS2019 编Rlease x86版本
在Qt5窗口显示D3D11的程序示例,运行前需要自己设置D3D11的环境和Qt5的环境。
https://blog.csdn.net/zlyadvocate/article/details/118669454配套代码
ffmpeg硬解码。windows下支持d3d9 d3d11硬件加速
windows mft d3d11渲染显示 播放器 键盘D删除播放器 键盘P 重新创建和播放视频
D3D11_Render
该示例程序用于演示用D3D11的模板缓冲区实现镜子反射及平面阴影的渲染效果。文件中附带exe文件及所有源代码,如果exe文件不能正常执行,请自行手动编译。 操作方法:鼠标左键按下旋转镜头,右键按下调整镜头远近。
D3D11初始化,一个最简单的D3D11应用程序。学习D3D的开始。
D3D11_Blur
使用D3D11接口API以三纹理方式高效渲染显示YUV格式的视频数据
采取三纹理方式使D3D可以直接渲染YUV数据
D3D11_DerfferredShading
D3D11_fire
D3D11_ShadowMap
D3D11绘图基础,实现一个简单的场景:旋转的彩色立方体的源代码。