原文: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;
}
}