Game Engine Basic:Clock(查询时钟)

游戏运行机制和时间通常密切相关,通常我们需要一个更高精度的时钟。

这里提供一个Window环境下高精度的Clock类。

它仅提供查询当前时间的功能。

(当前时间指,从它被构造函数初始化以来,到调用time()函数时,经过的时间)。

它的用法很简单,导入Clock.h头文件,

double nowTime = Clock::get()->time();

即将当前时间保存到nowTime变量里。

以下代码通过该函数测试系统提供的Sleep()函数精度

main.cpp

#include <iostream>
#include "Clock.h"

int main() {

    double nowTime = 0;

    do {
        nowTime = Clock::get()->time();
        printf("当前时间为%lf\n",nowTime);
        Sleep(1000);
    } while (nowTime<3);

    return 0;
}

每次运行的结果都有较大差别,可以看到系统提供的时间相关的函数精度并不是很高。

由于游戏循环等各种机制依赖于高精度的计时,因此我们有必要尝试自己实现一个Timer(计时器),而Timer的基础就是Clock。

Clock的原理是通过硬件相关的函数来实现的:

QueryPerformanceFrequecy函数可以保存CPU运行频率。

QueryPerformanceCounter函数可以保存CPU当前计数。

将开始记录计数的时间定义为0,当前时间可以通过公式算得:

当前时间  =(当前计数-开始时计数)/运行频率

Clock.h

#ifndef __CLOCK_H__
#define __CLOCK_H__

#include <Windows.h>

class Clock {
public:
    //获取时钟单例
    static Clock* get();
    //获取当前时间
    double time();
private:
    //创建同时,自动记录开始计数以及机器频率
    Clock();
    //销毁同时,处理instance指针
    ~Clock();

private:
    //时钟单例
    static Clock* instance;
    //本机频率(和CPU相关)
    LARGE_INTEGER machineFrequency;
    //开始时的计数
    LARGE_INTEGER countStart;
};

#endif

Clock.cpp

#include "Clock.h"

Clock* Clock::instance = nullptr;

Clock::Clock() {
    //获取机器频率
    QueryPerformanceFrequency(&machineFrequency);
    //获取开始时的计数
    QueryPerformanceCounter(&countStart);
}

Clock* Clock::get() {
    if (!instance) {
        instance = new Clock();
    }
    return instance;
}

double Clock::time(){
    LARGE_INTEGER countNow;
    QueryPerformanceCounter(&countNow);
    return (((double)countNow.QuadPart) - ((double)countStart.QuadPart)) / ((double)machineFrequency.QuadPart);
}

Clock::~Clock() {
    if (instance) {
        delete instance;
        instance = nullptr;
    }
}

原文地址:https://www.cnblogs.com/jyunlon/p/9497643.html

时间: 2024-10-27 11:41:55

Game Engine Basic:Clock(查询时钟)的相关文章

I.MX6 各模块 clock 查询

/********************************************************************* * I.MX6 各模块 clock 查询 * 说明: * 今天在查资料的时候无意中发现了查看内核时钟频率的方法,这东西 * 我一直以为不能查,只能通过查看源代码来看. * * 2016-8-1 深圳 南山平山村 曾剑锋 ********************************************************************/

hone hone clock人体时钟

hone hone clock是个十分有趣的人体时钟,这个时钟代码分两种一种是背景透明的,一种 是白色背景的,把你喜欢的代码添加到你的网页中适当位置即可.两种代码如下: <script charset="Shift_JIS" src="http://chabudai.sakura.ne.jp/blogparts/honehoneclock/honehone_clock_tr.js"></script> 或 <script charset

ajax 判断账户密码 调取数据模糊查询 时钟

一.判断账户密码 <Login.html> 1 <head> 2 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 3 <title></title> 4 <script src="Script/jquery.js"></script> 5 <script languag

QDemo - Analog clock模拟时钟学习并改进

调用函数setRenderHint(QPainter::Antialiasing,true),使绘制时边缘平滑,使用颜色浓度的变化,把图形的边缘转换为象素时引起的扭曲变形尽可能减少,在支持这一功能的平台或者绘图设备上得到一个平滑的边缘. QTimer类提供了定时器信号和单触发定时器. 它在内部使用定时器事件来提供更通用的定时器.QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽.当这段时间过去了,它将会发射timeout()信号. 我

ArcGIS Engine开发之旅08--和查询相关的对象和接口

查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询的时候,让我们先了解下面的对象. 1.Table 对象 Table 是不含有空间信息的一张二维表,它主要实现了 ITable 接口.在这张二维表中,每一行称之为 Row(IRow),ITable 接口 定义了对这张二维表行的插入,更新,查询,以及删除等操作. 独立表(standalone table):就是一个单独的不含空间信息的表也就是只能在 ArcMap 中 Tab

linux下使用date、hwclock和clock命令显示和设定时钟

linux将时钟分为系统时钟(System Clock)和硬件时钟(Real Time Clock )两种.系统时间指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的“Standard BIOS Feture”项中进行设置.当linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作,因此系统时钟和硬件时钟可以采用异步方式,即系统时间和硬件时间可以不同.从linux启动过程来看,系统时钟和硬件时钟不会发生冲突,

NTP And System Clock Maintenance

论NTP和Clock在业务场景中的重要性: 在开始探讨技术之前,先扯个闲篇儿^_^.从事IT相关技术的boy都知道,clock在日常工作的重要,尤其是从业时间较长或项目经验丰富的老司机来说,应该都会感同身受!刚从业的可能在这方面没有太多的体会&经验,这里我分个与时间有关业务场景来帮助说明下clock&NTP的重要性. Example : 在生产环境部署syslog服务器,以此来收集网络设备的各种日志,当前我的网络设备大概在500台以上.如果我的所有的交换机没有统一的时间,那么每天收集到百万

JavaScript+svg绘制的一个动态时钟

结果图: 代码如下: <!DOCTYPE html> <html> <head> <title>动态时钟</title> </head> <body > <script type="text/javascript"> function updateTime(){ //更新svg时钟来显示当前时间 var now =new Date(); //当前时间 var min = now.getMin

汇编实现时钟设置代码理解

下面的笔记是我在看<朱老师物联网大讲堂>(www.zhulaoshi.org)之后所做的笔记,只是大概根据自己看了视频与朱老师上课做的笔记而有的理解记录下来. 写了 有代码的,要把代码给理解完整. 朱老师的随堂程序是:clock.s // 时钟控制器基地址 #define ELFIN_CLOCK_POWER_BASE0xE0100000 // 时钟相关的寄存器相对时钟控制器基地址的偏移值 #define APLL_LOCK_OFFSET0x00 #define MPLL_LOCK_OFFSET