引擎之旅 Chapter.1 高分辨率时钟
文章目錄
- 游戲中的時間線
- 真實時間線
- 游戲時間線
- 全局時鐘的實現方式
我們如何理解時間。在現實生活中,時間就是一個有方向的直線。從一個無窮遠到另一個無窮遠。用數學去抽象地思考,它就是一個從無窮小到無窮大的一維軸。
那么,對于游戲而言,我們需要考慮關于時間的哪一部分?游戲本質就是開發者作為上帝創造的產物,在我們人為創造的世界中,自我們開始游戲的時候,這個世界的所有物體就應該根據一個既定的時間線作為參照物來進行運動——這個標準不是服務于策劃文案中的年代、一天的早中晚等寫實的時間線,而是動畫、邏輯等相關仿真運行的參照。
那么我們應該如何去用代碼實現游戲中的時間線呢?我們先對游戲中的時間線進行分析。
游戲中的時間線
真實時間線
真實的時間線指的是和現實的時間線的頻率保持一致的時間線。首先我們先明確一點,對于未運行的游戲而言,時間線是沒有意義的,因此,游戲中真實的時間線是以軟件啟動的時刻作為起點,而以軟件關閉作為時間線的終點。
游戲引擎一般將真實時間線作為引擎的全局時間線,即全局時鐘。全局時鐘是游戲時間線的基石,若全局時間線出問題,則游戲所有與時間相關的操作都會發生錯誤。因此,它的頻率嚴格一致,計時應當是高精度的,且不隨游戲的其他因素的變化而變化。此模塊的代碼將置于核心代碼中的最底層,并對其修改操作進行嚴格的限制。
游戲時間線
游戲時間線依托于真實時間線(全局時鐘)。根據不同的需求(一般指快進和減速),游戲中將擁有各種各樣的時間線,這些時間線服務于相對應游戲物體的運動和變化。相較于全局時鐘嚴格的不可變性,游戲時鐘可以很好的實現設計者的如下需求:
- 游戲暫停
- 游戲恢復
- 人物動畫加速
- 人物動畫減速
- 時間回溯
- …
全局時鐘的實現方式
大多數操作系統都提供獲取系統時間的函數,但這些函數都是低分辨率的,精確到秒或毫秒,則對于全局時鐘而言,是不滿足要求的。那么,我們應該如何實現呢?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*)¤t);return (current-m_StartStamp)/(double)m_Frequence;}private:__int64 m_StartStamp;__int64 m_Frequence;}總結
以上是生活随笔為你收集整理的引擎之旅 Chapter.1 高分辨率时钟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清华同方服务器做系统,清华同方云服务器底
- 下一篇: Go调度器系列(3)图解调度原理