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帧。
总结来说,规格较高好与较差的电脑相互比较的话,若要让两个在同一时间移动相同距离的话,是必得让单位一次位移较多的距离。
备注: 这个举例可能不好,且有偏误
《人月神话》这本书中一直强调: 软件设计很重要的原则之一,就是保有「概念的整体性」。 为什麽要保有概...
完结洒花 当初只是想藉这个机会督促自己学新东西,还真的没想到能够完赛 xD 这是我第一次写技术文章 ...
如果你是一名前端工程师,那麽你应该会有跟後端要 API 文件的经验,如果你是一名後端工程师,那你应该...
大家好,我是长风青云。 今天是铁人赛第一天,我就先来一个不硬核的介绍。 说话颠三倒四,声音也不怎麽好...
musl libc的起源为当时glibc於设计上有诸多不足之处,例如全静态连结因NSS机制而有状况、...