原文:https://github.com/SilverTiger/lwjgl3-tutorial/wiki/Timing
譯註:翻譯僅供參考,請以原文爲準。代碼請看原文中的鏈接。括號裏的內容一般也是譯註,供理解參考用。
此篇乃上一篇《遊戲循環》的附篇,供理解上一篇的範例代碼用。
Getting the system time 獲取系統時間
主要原理就是取程度的系統時間。需要一個計時器(timer),精度至少得是毫秒,甚至是納秒。
既然LWJGL3有GLFW接口,我們可以用glfwGetTime()取到自glfwInit()以來的時間秒數。
public double getTime() {
return glfwGetTime();
}
如果你不想用這個,也可以用JAVA的System.nanoTime()然後除以1000000000得到秒數。
public double getTime() {
return System.nanoTime() / 1000000000.0;
}
Calculating delta time 計算時間增量
爲了計算時間增量,需要存下上次循環的系統時間,這個值還得在開始遊戲循環的時候初始化。
double lastLoopTime;
public void init() {
lastLoopTime = getTime();
}
計算時間增量很簡單。
public float getDelta() {
double time = getTime();
float delta = (float) (time - lastLoopTime);
lastLoopTime = time;
timeCount += delta;
return delta;
}
可以看到還有一個計數器變量(timeCount),這是用來計算FPS和UPS的。(FPS:每秒渲染畫面次數,UPS每秒更新次數)
FPS and UPS calculation FPS和UPS的計算
有許多方法可以算FPS和UPS,本教程我們需要5個變量來算。
float timeCount;
int fps;
int fpsCount;
int ups;
int upsCount;
現在只要遊戲循環調用update(),就要增加upsCount,而在render()後,也要增加fpsCount。
public void updateFPS() {
fpsCount++;
}
public void updateUPS() {
upsCount++;
}
爲了刷新FPS和UPS值,我們需要在每次循環後更新計時器。如果整一秒的時間經過,我們就更新它們的值。
public void update() {
if (timeCount > 1f) {
fps = fpsCount;
fpsCount = 0;
ups = upsCount;
upsCount = 0;
timeCount -= 1f;
}
}