Directx11教程(9) 增加一个TimerClass类
原文:Directx11教程(9) 增加一个TimerClass类
在上篇教程代码的基础上,我们增加一个TimerClass类,这个类的功能很简单,就是可以计算相邻2帧的时间差。利用这个时间差值,可以实现平滑的动画,使得动画不会因为不同机器fps不同,从而动画效果变快或者变慢。
我们主要是利用QueryPerformanceCounter函数来查询定时器的计数值。
如果硬件里有定时器,它会启动这个定时器,之后会不断获取定时器的值,这样的定时器精度,就跟硬件时钟的晶振一样精确的。
TimerClass.h代码如下:
#pragma once
#include <windows.h>
//主要用来计算相邻两帧之间的时间
//可以用来实现平滑的与fps无关的动画。
class TimerClass
{
public:
TimerClass(void);
TimerClass(const TimerClass&);
~TimerClass(void);
bool Initialize();
void Frame();
float GetTime();
private:
INT64 m_frequency;
float m_ticksPerMs;
INT64 m_startTime;
float m_frameTime;
};
TimerClass.cpp代码如下:
#include "TimerClass.h"
TimerClass::TimerClass(void)
{
}
TimerClass::TimerClass(const TimerClass& other)
{
}
TimerClass::~TimerClass(void)
{
}
bool TimerClass::Initialize()
{
// 检测系统是否支持高精度计时器.
QueryPerformanceFrequency((LARGE_INTEGER*)&m_frequency);
if(m_frequency == 0)
{
return false;
}
// 得到每毫秒多少个计数器.
m_ticksPerMs = (float)(m_frequency / 1000);
QueryPerformanceCounter((LARGE_INTEGER*)&m_startTime);
return true;
}
//每个渲染帧都会被调用,从而计算出每帧之间的时间
void TimerClass::Frame()
{
INT64 currentTime;
float timeDifference;
QueryPerformanceCounter((LARGE_INTEGER*)& currentTime);
timeDifference = (float)(currentTime - m_startTime);
m_frameTime = timeDifference / m_ticksPerMs;
m_startTime = currentTime;
return;
}
float TimerClass::GetTime()
{
return m_frameTime;
}
我们在SystemClass.h中增加一些代码,包含TimerClass.h
…
#include "GraphicsClass.h"
#include "TimerClass.h"
const float PI = 3.14159265358979323f;
class SystemClass
{
…
GraphicsClass* m_Graphics;
//计时器类
TimerClass* m_Timer;
};
SystemClass.cpp代码如下,我只贴出了修改了代码的函数。
#include "SystemClass.h"
SystemClass::SystemClass(void)
{
m_Input = 0;
m_Graphics = 0;
m_Timer = 0;
}
//调用窗口初始化函数和其它一些类的初始化函数
bool SystemClass::Initialize()
{
…
// 初始化图形对象
result = m_Graphics->Initialize(screenWidth, screenHeight, m_hwnd);
if(!result)
{
return false;
}
// 创建计时器对象.
m_Timer = new TimerClass;
if(!m_Timer)
{
return false;
}
// 初始化计时器对象
result = m_Timer->Initialize();
if(!result)
{
MessageBox(m_hwnd, L"Could not initialize the Timer object.", L"Error", MB_OK);
return false;
}
return true;
}
bool SystemClass::Frame()
{
…
m_Timer->Frame();
根据时间来设定摄像机旋转的角度,基本上能保证旋转不会因为fps不同而不同
//动画,旋转摄像机
m_Graphics->m_Camera->roll(m_Timer->GetTime()/1000);
// 执行帧渲染函数.
result = m_Graphics->Frame();
if(!result)
{
return false;
}
return true;
}
程序执行后,将会发现一个旋转的颜色立方体,你也可以用Q,W,E,A,S,D,Z,X,C控制摄像机,改变观察方向。
程序的截图和上篇教程中的图是一样的。
完整的代码请参考:
工程文件myTutorialD3D11_8
代码下载:
http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip
Directx11教程(9) 增加一个TimerClass类的更多相关文章
- Directx11教程(11) 增加一个debug宏
原文:Directx11教程(11) 增加一个debug宏 现在我们在common.h中增加一个debug的宏,在每个d3d11函数后调用,如果d3d函数出错,它能够给出程序中错误的代码行 ...
- Directx11教程(56) 建立一个skydome
原文:Directx11教程(56) 建立一个skydome 本章建立一个skydome(天空穹),主要学习如何使用cube mapping. cube map就是把六张纹理当作 ...
- Directx11教程(5) 画一个简单的三角形(1)
原文:Directx11教程(5) 画一个简单的三角形(1) 在本篇教程中,我们将通过D3D11画一个简单的三角形.在D3D11中,GPU的渲染主要通过shader来操作(当然还有一些操作 ...
- Directx11教程(10) 画一个简易坐标轴
原文:Directx11教程(10) 画一个简易坐标轴 本篇教程中,我们将在三维场景中,画一个简易的坐标轴,分别用红.绿.蓝三种颜色表示x,y,z轴的正向坐标轴. 为此,我们要先建立一个A ...
- Directx11教程(7) 画一个颜色立方体
原文:Directx11教程(7) 画一个颜色立方体 前面教程我们通过D3D11画了一个三角形,本章我们将画一个颜色立方体,它的立体感更强.主要的变动是ModelClass类,在Model ...
- Directx11教程(6) 画一个简单的三角形(2)
原文:Directx11教程(6) 画一个简单的三角形(2) 在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变, ...
- Directx11教程(19) 画一个简单的地形
原文:Directx11教程(19) 画一个简单的地形 通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者 ...
- Directx11教程(4) 一个最基本D3D应用程序(2)
原文:Directx11教程(4) 一个最基本D3D应用程序(2) 接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架. 我们增加一个新类D3DClass, 用来处理3D渲 ...
- Directx11教程(8) 一个新的camera类
原文:Directx11教程(8) 一个新的camera类 本章我们将替换掉CameraClass类,实现一个稍微靠谱点的摄像机类.并通过Q,W,E,A,S,D,Z,X,C等按键实现摄像机的 ...
随机推荐
- linux 编译C语言代码后产生OBJ文件的方法
如果你不指定编译成什么文件,gcc默认一步到位,直接生成可执行文件你可以试试以下几个参数 -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他 ...
- ie浏览器将网页转成pdf
今天同事让我帮他将网页转成pdf,学了一个.先推荐一个超图的数据库使用指南:http://support.supermap.com.cn/DataWarehouse/WebDocHelp/6.1.1/ ...
- 原 ASP.net out 和ref之间的区别
ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递.对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别.总结起来,他们有如下语法区别: 1.ref传 ...
- Luogu P1979 华容道(bfs+最短路)
P1979 华容道 题意 题目描述 小B最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成, 最少需要多少时间. ...
- Django项目:CRM(客户关系管理系统)--33--25PerfectCRM实现King_admin添加出错修复
{#table_change.html#} {## ————————19PerfectCRM实现King_admin数据修改————————#} {#{% extends "king_mas ...
- return语句必须要注意的地方
先看下面程序: function foo1() { return { /*返回对象{}他留有一个大括号跟return在同一行*/ bar: "hello" }; } functio ...
- 数据库迁移工具DBMigration
- tomcat的三种部署项目的方式
1.直接将项目放在webapps目录下. 如果将项目直接打成WAR包,放在webapps目录下会自动解压 项目的文件夹名称就是项目的访问路径,也就是虚拟目录. 2.配置conf文件夹下的server. ...
- Nginx负载均衡反向代理
http{ upstream test.com { server 118.118.66.88:8080; } server { listen 80; server_name www.test.com; ...
- Comparator进行List集合排序
对数据库中查询到的结果进行排序,一般开发中,实体类是没有实现Comparable接口的,所以不能实现compareTo()方法进行排序, 只能用Comparator去进行排序,只需要在带排序的集合中加 ...