Clock負責提供一個真實時間和一個虛擬時間,真實時間從0開始按ms遞增,和硬件時鐘是同步的;虛擬時間也從0開始按ms遞增,但不一定和真實時間同步。
要獲得系統時間可以用System.currentTimeMillies(),系統硬件有一個計數器,當計算機啟動時,計數器從0開始每1ms加1,System.currentTimeMillIEs()返回從開機到現在經過的ms。我們不需要知道時分秒,只需要一個遞增的整數計時就可以了。
Clock改自Marshall "Game Programming Gems 3"中的C++代碼,主要成員變量:
thisTime:當前硬件時間,即System.currentTimeMillIEs()
systemTime:游戲的系統時間,即把thisTime轉換為從0遞增的時間
virtualTime:虛擬時間,從0遞增,但和真實時間不同步
代碼如下:
package game.engine.core; class Clock { // Clock是否運行: private boolean running; // 當前hardware clock: private int thisTime; // record the last hardware clock when calling stop(): private int lastTime; // systemTime從0開始遞增,和硬件時鐘同步: private int systemTime; // systemOffset就是硬件時鐘和systemTime的差: private int systemOffset; // 上一次停止的systemTime: private int pauseAt; // virtualTime starts from 0. private int virtualTime; // virtualOffset records how long the clock paused: private int virtualOffset; private int frameStart; private int frameEnd; private int frameCount; public Clock() { reset(); } // 重置Clock: public void reset() { running = false; // get the hardware clock: thisTime = (int)System.currentTimeMillis(); lastTime = thisTime; // and systemTime starts from 0: systemTime = 0; systemOffset = thisTime; pauseAt = 0; // init virtual time: virtualTime = 0; virtualOffset = 0; // init frame time: frameStart = 0; frameEnd = 0; frameCount = 0; } // 同步hardware clock: private void update() { lastTime = thisTime; thisTime = (int)System.currentTimeMillis(); // increase the systemTime: systemTime += (thisTime - lastTime); } // 啟動Clock: public void start() { if(!running) { running = true; update(); virtualOffset += (systemTime - pauseAt); System.out.println("[start]"); } } // 停止Clock: public void stop() { if(running) { running = false; update(); pauseAt = systemTime; System.out.println("[stop] at " + pauseAt); } } // Clock是否運行: pu