【LWJGL官方教程】Timing 計時

原文: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;
    }
}
發佈了13 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章