我们如何理解时间。在现实生活中,时间就是一个有方向的直线。从一个无穷远到另一个无穷远。用数学去抽象地思考,它就是一个从无穷小到无穷大的一维轴。

那么,对于游戏而言,我们需要考虑关于时间的哪一部分?游戏本质就是开发者作为上帝创造的产物,在我们人为创造的世界中,自我们开始游戏的时候,这个世界的所有物体就应该根据一个既定的时间线作为参照物来进行运动——这个标准不是服务于策划文案中的年代、一天的早中晚等写实的时间线,而是动画、逻辑等相关仿真运行的参照。

那么我们应该如何去用代码实现游戏中的时间线呢?我们先对游戏中的时间线进行分析。

游戏中的时间线

真实时间线

真实的时间线指的是和现实的时间线的频率保持一致的时间线。首先我们先明确一点,对于未运行的游戏而言,时间线是没有意义的,因此,游戏中真实的时间线是以软件启动的时刻作为起点,而以软件关闭作为时间线的终点。

游戏引擎一般将真实时间线作为引擎的全局时间线,即全局时钟。全局时钟是游戏时间线的基石,若全局时间线出问题,则游戏所有与时间相关的操作都会发生错误。因此,它的频率严格一致,计时应当是高精度的,且不随游戏的其他因素的变化而变化。此模块的代码将置于核心代码中的最底层,并对其修改操作进行严格的限制。

游戏时间线

游戏时间线依托于真实时间线(全局时钟)。根据不同的需求(一般指快进和减速),游戏中将拥有各种各样的时间线,这些时间线服务于相对应游戏物体的运动和变化。相较于全局时钟严格的不可变性,游戏时钟可以很好的实现设计者的如下需求:

  • 游戏暂停
  • 游戏恢复
  • 人物动画加速
  • 人物动画减速
  • 时间回溯
  • ...

全局时钟的实现方式

大多数操作系统都提供获取系统时间的函数,但这些函数都是低分辨率的,精确到秒或毫秒,则对于全局时钟而言,是不满足要求的。那么,我们应该如何实现呢?CPU恰好提供了硬件级别的高精度时钟供我们去计时。

CPU的高分辨率计时器:每个CPU都存在一个计时器,其功能就是将计算机自启动或重置起经过CPU的周期数记录到对应的寄存器中。

不同硬件访问CPU寄存器的方式是不同的,幸运的是Windows这一个巨大的抽象层帮助我们忽略了各式各样硬件的差异。在Windows API中,获取计时寄存器的相关函数如下:

  • QueryPerformanceCounter():计时寄存器数值
  • QueryPerformanceFrequency():每一秒计时器递增的次数(即计时器频率)

利用这两个函数,我们可以实现一个高精度的计时器作为游戏引擎的全局时钟。极简代码如下所示。

#include "Windows.h"
class Timer
{
public:
Timer()
{
QueryPerformanceFrequency((LARGE_INTEGER*)&m_Frequence);
QueryPerformanceCounter((LARGE_INTEGER*)&m_StartStamp);
} //获取至生成计时器以来运行的秒数
double RunSeconds()
{
__int64 current=0;
QueryPerformanceCounter((LARGE_INTEGER*)&current);
return (current-m_StartStamp)/(double)m_Frequence;
}
private:
__int64 m_StartStamp;
__int64 m_Frequence; }

引擎之旅 Chapter.1 高分辨率时钟的更多相关文章

  1. 引擎之旅 Chapter.4 日志系统

    关于近段时间为何没有更新的解释:Find a new job. 目录 引言 日志语句的分类 控制台窗体 和 VSOutput Tab的日志打印 存储至特定的文件中 展示堆栈信息 引言 一般来说,一个优 ...

  2. 引擎之旅 Chapter.2 线程库

    预备知识可参考我整理的博客 Windows编程之线程:https://www.cnblogs.com/ZhuSenlin/p/16662075.html Windows编程之线程同步:https:// ...

  3. 引擎之旅 前传:C++代码规范

    自己以前写代码时,一个项目一个风格.单人开发的工作使得我并没有注意到代码规范性和可读性的问题.每当项目结束后,看到自己杂乱无章的代码,完全没有二次开发和重构的欲望. 写代码就应该像写诗一样优雅. by ...

  4. Linux时间管理涉及数据结构和传统低分辨率时钟的实现

    上篇文章大致描述了Linux时间管理的基本情况,看了一些大牛们的博客感觉自己写的内容很匮乏,但是没办法,只能通过这种方式提升自己……闲话不说,本节介绍下时间管理下重要的数据结构 设备相关数据结构 // ...

  5. linux 时间管理——概念、注意点(一)【转】

    转自:http://www.cnblogs.com/openix/p/3324243.html 参考:1.http://bbs.eyeler.com/thread-69-1-1.html        ...

  6. 14.1.1 InnoDB as the Default MySQL Storage Engine

    14.1 Introduction to InnoDB 14.1.1 InnoDB as the Default MySQL Storage Engine 14.1.2 Checking InnoDB ...

  7. 初探linux子系统集之timer子系统(二)

    想着博客中还没有翻译过一篇文章,虽然英文水平有限,但是借助google翻译慢慢地翻译出一篇文章也是不错的选择.那就来学习下hrtimer的文档吧,翻译的略搓,可以直接跳过这篇,这里仅作为学习的过程!^ ...

  8. c++ 常用头文件

    1.#include<iostream> iostream 的意思是输入输出流.#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头 ...

  9. Linux内核入门到放弃-时间管理-《深入Linux内核架构》笔记

    低分辨率定时器的实现 定时器激活与进程统计 IA-32将timer_interrupt注册为中断处理程序,而AMD64使用的是timer_event_interrupt.这两个函数都通过调用所谓的全局 ...

随机推荐

  1. .NET6接入Skywalking链路追踪完整流程

    一.Skywalking介绍 Skywalking是一款分布式链路追踪组件,什么是链路追踪? 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软 ...

  2. java获取本地json格式的内容

    前言 该功能模块基于springBoot,自己在开发中遇到相关功能开发,总结如写: 1.首先将所需要获取的json文件放在项目resource目录下: 2.所需要的pom依赖: <depende ...

  3. 《AlignedReID:Surpassing Human-Level Performance in Person Re-Identification》理解

  4. 【摸鱼神器】UI库秒变低代码工具——表单篇(二)子控件

    上一篇介绍了表单控件,这一篇介绍一下表单里面的各种子控件的封装方式. 主要内容 需求分析 子控件的分类 子控件属性的分类 定义 interface. 定义子控件的的 props. 定义 json 文件 ...

  5. CSDN 原力(声望,影响力) -- 设计草案

    目标 CSDN 希望成为开发者学习,成长和成就的平台.我们已经有很多功能来支持开发者的职业成长了, 如何衡量成就呢?我们希望用 原力 (以前也叫 影响力,声望) 来体现用户的成就, 并希望用原力来帮助 ...

  6. 小C的记事本_via牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28537/G 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语 ...

  7. python 上下文管理(with、contextmanager)

    简介 python中存在这么一个非常好用的东西,能够帮助我们更好的管理上下文,这种东西就成为上下文管理器,例如我们最常见的with open,在读取文件时可以很方便的进行文件描述符和文件对象的打开和关 ...

  8. python获取线程返回值

    python获取线程返回值 前言 工作中的需求 将前端传过来的字符串信息通过算法转换成语音,并将语音文件返回回去 由于算法不是我写的,只需要调用即可,但是算法执行速度相当缓慢 我的优化思路是,将前端的 ...

  9. 承上启下继往开来,Python3上下文管理器(ContextManagers)与With关键字的迷思

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_217 在开发过程中,我们会经常面临的一个常见问题是如何正确管理外部资源,比如数据库.锁或者网络连接.稍不留意,程序将永久保留这些资 ...

  10. Vue 基本列表 && 数据过滤与排序

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...