《游戏编程模式》笔记——游戏循环
什么是游戏循环
我相信绝大多数游戏并不是运行后自动噼里啪啦的处理一堆数据后就自动关闭的程序。
游戏会等待玩家的输入,处理数据,最后把画面渲染出来告诉玩家的输入结果,即使不输入,处理数据和画面渲染也会一直进行下去,直到玩家关闭整个游戏。
输入、处理、渲染就构成了最简单也是最关键的游戏循环。
帧率
那么游戏循环的速度究竟多快才合适呢?
我们用实际的时间来测试循环的运行速度便得到了帧率(FPS),越高的帧率意味着越流畅的游戏体验,但是帧率会受到游戏本身以及运行游戏的机器配置受到影响。
固定帧率
通常,可以把帧数固定为30FPS或者60FPS,这意味着每帧可以让游戏处理更多的事情。
假设我们想让游戏以60FPS运行,每帧约16毫秒。只要我们能在这个时长内处理完所有的事情,游戏就可以稳定的以60FPS运行,而我们需要在所有的处理完成后等待一段时间。

再进一步,我们希望每帧游戏可以多处理几次,更充分的利用每一帧的时间,我们可以让处理进行循环,并增加一个步长,在步长追赶上真实时间后再进行渲染。

这样,我们充分的利用了每一帧的时间,但需要我们确定好一个合适的步长。
控制游戏速度的几种方案
固定时间步长,没有同步:
最简单,我们只需要尽可能快的运行游戏。游戏速度受游戏复杂度和硬件性能直接影响,游戏速度和游戏循环紧密相关。
固定时间步长,有同步:
比上一个方案复杂一点,需要在循环结尾增加同步点,使游戏不会运行太快,这节约了一部分性能,对硬件比较友好。但是没有分离处理和渲染,会是播放减慢。
动态时间步长:
通过动态步长,避免游戏运动太快或者太慢,但会让游戏变得不确定且不稳定。
固定时间更新时间步长,动态渲染:
最复杂,也最具适应性。以固定的时间更新步长,如果需要追赶上玩家的时间,可以扔掉一些渲染帧。
同样可以避免游戏运行的太快或者太慢,但也更复杂,需要在实现的时候写更多的东西。需要将更新的时间步长调整的尽可能小来适应高端机器,同时不至于在低端机上太慢。
参考
《游戏编程模式》