Clock负责提供一个真实时间和一个虚拟时间,真实时间从0开始按ms递增,和硬件时钟是同步的;虚拟时间也从0开始按ms递增,但不一定和真实时间同步。
要获得系统时间可以用System.currentTimeMillies(),系统硬件有一个计数器,当计算机启动时,计数器从0开始每1ms加1,System.currentTimeMillies()返回从开机到现在经过的ms。我们不需要知道时分秒,只需要一个递增的整数计时就可以了。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/) 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