引擎之旅 Chapter.1 高分辨率时钟
文章目錄
- 游戲中的時(shí)間線
- 真實(shí)時(shí)間線
- 游戲時(shí)間線
- 全局時(shí)鐘的實(shí)現(xiàn)方式
我們?nèi)绾卫斫鈺r(shí)間。在現(xiàn)實(shí)生活中,時(shí)間就是一個(gè)有方向的直線。從一個(gè)無窮遠(yuǎn)到另一個(gè)無窮遠(yuǎn)。用數(shù)學(xué)去抽象地思考,它就是一個(gè)從無窮小到無窮大的一維軸。
那么,對(duì)于游戲而言,我們需要考慮關(guān)于時(shí)間的哪一部分?游戲本質(zhì)就是開發(fā)者作為上帝創(chuàng)造的產(chǎn)物,在我們?nèi)藶閯?chuàng)造的世界中,自我們開始游戲的時(shí)候,這個(gè)世界的所有物體就應(yīng)該根據(jù)一個(gè)既定的時(shí)間線作為參照物來進(jìn)行運(yùn)動(dòng)——這個(gè)標(biāo)準(zhǔn)不是服務(wù)于策劃文案中的年代、一天的早中晚等寫實(shí)的時(shí)間線,而是動(dòng)畫、邏輯等相關(guān)仿真運(yùn)行的參照。
那么我們應(yīng)該如何去用代碼實(shí)現(xiàn)游戲中的時(shí)間線呢?我們先對(duì)游戲中的時(shí)間線進(jìn)行分析。
游戲中的時(shí)間線
真實(shí)時(shí)間線
真實(shí)的時(shí)間線指的是和現(xiàn)實(shí)的時(shí)間線的頻率保持一致的時(shí)間線。首先我們先明確一點(diǎn),對(duì)于未運(yùn)行的游戲而言,時(shí)間線是沒有意義的,因此,游戲中真實(shí)的時(shí)間線是以軟件啟動(dòng)的時(shí)刻作為起點(diǎn),而以軟件關(guān)閉作為時(shí)間線的終點(diǎn)。
游戲引擎一般將真實(shí)時(shí)間線作為引擎的全局時(shí)間線,即全局時(shí)鐘。全局時(shí)鐘是游戲時(shí)間線的基石,若全局時(shí)間線出問題,則游戲所有與時(shí)間相關(guān)的操作都會(huì)發(fā)生錯(cuò)誤。因此,它的頻率嚴(yán)格一致,計(jì)時(shí)應(yīng)當(dāng)是高精度的,且不隨游戲的其他因素的變化而變化。此模塊的代碼將置于核心代碼中的最底層,并對(duì)其修改操作進(jìn)行嚴(yán)格的限制。
游戲時(shí)間線
游戲時(shí)間線依托于真實(shí)時(shí)間線(全局時(shí)鐘)。根據(jù)不同的需求(一般指快進(jìn)和減速),游戲中將擁有各種各樣的時(shí)間線,這些時(shí)間線服務(wù)于相對(duì)應(yīng)游戲物體的運(yùn)動(dòng)和變化。相較于全局時(shí)鐘嚴(yán)格的不可變性,游戲時(shí)鐘可以很好的實(shí)現(xiàn)設(shè)計(jì)者的如下需求:
- 游戲暫停
- 游戲恢復(fù)
- 人物動(dòng)畫加速
- 人物動(dòng)畫減速
- 時(shí)間回溯
- …
全局時(shí)鐘的實(shí)現(xiàn)方式
大多數(shù)操作系統(tǒng)都提供獲取系統(tǒng)時(shí)間的函數(shù),但這些函數(shù)都是低分辨率的,精確到秒或毫秒,則對(duì)于全局時(shí)鐘而言,是不滿足要求的。那么,我們應(yīng)該如何實(shí)現(xiàn)呢?CPU恰好提供了硬件級(jí)別的高精度時(shí)鐘供我們?nèi)ビ?jì)時(shí)。
CPU的高分辨率計(jì)時(shí)器:每個(gè)CPU都存在一個(gè)計(jì)時(shí)器,其功能就是將計(jì)算機(jī)自啟動(dòng)或重置起經(jīng)過CPU的周期數(shù)記錄到對(duì)應(yīng)的寄存器中。
不同硬件訪問CPU寄存器的方式是不同的,幸運(yùn)的是Windows這一個(gè)巨大的抽象層幫助我們忽略了各式各樣硬件的差異。在Windows API中,獲取計(jì)時(shí)寄存器的相關(guān)函數(shù)如下:
- QueryPerformanceCounter():計(jì)時(shí)寄存器數(shù)值
- QueryPerformanceFrequency():每一秒計(jì)時(shí)器遞增的次數(shù)(即計(jì)時(shí)器頻率)
利用這兩個(gè)函數(shù),我們可以實(shí)現(xiàn)一個(gè)高精度的計(jì)時(shí)器作為游戲引擎的全局時(shí)鐘。極簡(jiǎn)代碼如下所示。
#include "Windows.h" class Timer {public:Timer(){QueryPerformanceFrequency((LARGE_INTEGER*)&m_Frequence);QueryPerformanceCounter((LARGE_INTEGER*)&m_StartStamp);}//獲取至生成計(jì)時(shí)器以來運(yùn)行的秒數(shù)double RunSeconds(){__int64 current=0;QueryPerformanceCounter((LARGE_INTEGER*)¤t);return (current-m_StartStamp)/(double)m_Frequence;}private:__int64 m_StartStamp;__int64 m_Frequence;}總結(jié)
以上是生活随笔為你收集整理的引擎之旅 Chapter.1 高分辨率时钟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清华同方服务器做系统,清华同方云服务器底
- 下一篇: 【思考】AI太热门,博士也不好找工作了吗