iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
自我挑戰組

翻車機率極高的2D平台遊戲(2D Platformer)製作系列 第 12

[Day12] 關於時間粗略紀錄一下

今日目標

  • TimeDeltaTime

Game Loop

之前沒有寫到這個,但至今一直在用,簡單的說

while (true) {
    input()
    update()
    render()
}

這個就是所謂的Game Loop,遊戲程式可以很簡單的拆成這樣的模型,然後在這之中,有個一直循環的變數,就是時間,就如同我們的世界一樣,生生不息。

第一次嘗試: Time與Delta Time

之前寫過Unity,那就先來使用最常見的GetTime()DeltaTime()吧。

GetTime很簡單,可以直接用glfw包裝好的。

// [iron_window] get time
float GetTime() {
    return (float)glfwGetTime();
}

GetDeltaTime的話就是前一個game loop與當前game loop更新的時間差,記得iron_window裡面有StartSceneEndScene,也剛好接game loop的頭尾,於是我這樣寫來著...

// in `StartScene`
WINDOW.Time.previous_time = WINDOW.Time.current_time;
WINDOW.Time.current_time = (float)glfwGetTime();
WINDOW.Time.delta_time = WINDOW.Time.current_time - WINDOW.Time.previous_time;

然後寫一個function,回傳delta_time就好了!

等等!就這麼簡單嗎!

後來我在網上找到幾個有趣的小主題與一些有名的開源專案,確實還有不少東西可以研究研究...

固定幀數

為什麼要固定幀數呢?FPS不是越多越好嗎?原因是如果直接放下去跑,那「通常」game loop的更新頻率就會直接是CPU的頻率了,通常不會有這感覺,原因是還有一個螢幕輸出的極限在,所以FPS印出來會是螢幕的最大赫茲數。

備註: FPS與時間的關係,FPS = 1 / update_time,update_time == delta_time

Framerate Independent

這個我之前完全沒聽過,但要理解其實蠻簡單的,甚至應該說我早就在用了,只是不知道背後的知識。

目前FPS為60,視窗寬度為600,設想一台車子從視窗左邊跑到右邊,要1秒的時間過去的話,移動距離要多少?答案很簡單是10個單位;若突然FPS驟降,來到30,一樣要讓車子1秒就到終點的話,移動距離就要變成20幀。

總結來說,規格較高好與較差的電腦相互比較的話,若要讓兩個在同一時間移動相同距離的話,是必得讓單位一次位移較多的距離。

備註: 這個舉例可能不好,且有偏誤

參考

今天的成果


上一篇
[Day11] 2D的數學世界 (三) - 位移、旋轉、縮放
下一篇
[Day13] 時間處理
系列文
翻車機率極高的2D平台遊戲(2D Platformer)製作33

尚未有邦友留言

立即登入留言