Time
與DeltaTime
之前沒有寫到這個,但至今一直在用,簡單的說
while (true) {
input()
update()
render()
}
這個就是所謂的Game Loop,遊戲程式可以很簡單的拆成這樣的模型,然後在這之中,有個一直循環的變數,就是時間,就如同我們的世界一樣,生生不息。
之前寫過Unity,那就先來使用最常見的GetTime()
跟DeltaTime()
吧。
GetTime很簡單,可以直接用glfw
包裝好的。
// [iron_window] get time
float GetTime() {
return (float)glfwGetTime();
}
GetDeltaTime的話就是前一個game loop與當前game loop更新的時間差,記得iron_window
裡面有StartScene
與EndScene
,也剛好接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
這個我之前完全沒聽過,但要理解其實蠻簡單的,甚至應該說我早就在用了,只是不知道背後的知識。
目前FPS為60,視窗寬度為600,設想一台車子從視窗左邊跑到右邊,要1秒的時間過去的話,移動距離要多少?答案很簡單是10個單位;若突然FPS驟降,來到30,一樣要讓車子1秒就到終點的話,移動距離就要變成20幀。
總結來說,規格較高好與較差的電腦相互比較的話,若要讓兩個在同一時間移動相同距離的話,是必得讓單位一次位移較多的距離。
備註: 這個舉例可能不好,且有偏誤