[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帧。

总结来说,规格较高好与较差的电脑相互比较的话,若要让两个在同一时间移动相同距离的话,是必得让单位一次位移较多的距离。

备注: 这个举例可能不好,且有偏误

参考

今天的成果


<<:  第6砍 - 提枪上阵

>>:  【D8】重新磨刀:重看Stocks

Day05:总之,架构设计什麽的,非常重要

《人月神话》这本书中一直强调: 软件设计很重要的原则之一,就是保有「概念的整体性」。 为什麽要保有概...

【从实作学习ASP.NET Core】Day30 | 总结与回顾

完结洒花 当初只是想藉这个机会督促自己学新东西,还真的没想到能够完赛 xD 这是我第一次写技术文章 ...

[NestJS 带你飞!] DAY26 - Swagger (上)

如果你是一名前端工程师,那麽你应该会有跟後端要 API 文件的经验,如果你是一名後端工程师,那你应该...

Day1 - 基本心态及课程介绍

大家好,我是长风青云。 今天是铁人赛第一天,我就先来一个不硬核的介绍。 说话颠三倒四,声音也不怎麽好...

musl libc 简介与其 porting(一)

musl libc的起源为当时glibc於设计上有诸多不足之处,例如全静态连结因NSS机制而有状况、...