目录
一、意图
将游戏的进行和玩家的输入解耦,和处理器速度解耦。
二、动机
一个真实游戏循环的第一个关键部分:它处理用户输入,但是不等待它。循环总是继续旋转。
使用实际时间来测算游戏循环运行的速度,就得到了帧率FPS。
一个简单的while循环是能转多快转多快。两个因素决定它的帧率:
1.每帧需要做的工作。(复杂的物理,众多需要渲染的对象......)
2.底层平台的速度。更快的芯片可以在同样的时间里执行更多的代码。多核,GPU组,独立声卡,以及系统的调度都影响了每帧能做多少东西。
早期的视频游戏,第二个因素是固定的。如果在快些或者慢些的计算机上运行,就会造成游戏加速或者减速。新的计算机运行太快,所以无法运行旧的游戏。
三、游戏循环
一个游戏循环在游玩中不断运行。每一次循环,它无阻塞的处理玩家的输入,更新游戏状态,渲染游戏。他跟踪时间的消耗并控制游戏的速度。
很多时候游戏引擎帮助我们做了这些事,比如Unity的生命周期函数等等。
四、实例代码
1.能跑多快跑多快
2.休息一下
如果要游戏以60FPS运行,那就是每帧大约16毫秒。就必须限定这帧在16毫秒 内处理完所有事,并等待一下到16毫秒即可。
3.可以走一小步,也可以走一大步
基于上一帧到目前的真实时间流逝来刷新。
好处:
1.游戏在不同的硬件上以固定的速度运行。
2.使用高端机器的玩家获得更流畅的游戏体验。
缺点:
游戏不稳定。比如:在双人联机游戏中,一个子弹的同时飞行,好的机器刷新更快,再加上浮点数的舍入误差,刷新得多的会误差更大,最终两个机器的表现是不一样的。
4.固定时间刷新
以固定时间刷新游戏,让所有事情变得简单,物理和AI更加稳定。
自上一次游戏循环过去了一定量的真实时间。需要为游戏的“当前时间”模拟推进相同长度的时间,以追上玩家的时间。
但是固定步长的渲染可能会在两次更新之间渲染 ,就会造成一些移动上的卡顿。比如:一个子弹飞过屏幕,第一次更新还在左边,第二次更新就在右边。但玩家需要看到子弹在屏幕中间,所以就造成了卡顿。
这里的修正是,当渲染时间比更新时间大时,跳出循环,渲染上一帧到更新时间的内容。
五、目前的游戏循环
六、用电量相关
七、总结
1.固定时间步长,没有同步
1.简单
2.游戏速度直接受到硬件和游戏复杂度影响
2.固定时间步长,有同步
1.也很简单(比上一种多一行代码)
2.电量友好。简单的休眠几毫秒而不是试图每帧塞入更多处理,就可节约电量。
3.游戏不会运行太快
4.游戏可能循环得太慢。这个方法没有分离更新和渲染。没法丢掉渲染帧来追上真实时间,游戏本身会变慢。
3.动态时间步长
1.能适应并调整,避免运行得太快或者太慢。
只要能实时更新,游戏状态就不会落后于真实时间。如果玩家用高端的机器,它会回以更平滑的游戏体验。
2.复杂。
需要将更新的时间调整得尽可能小来适应高端机,同时不至于在低端机上太慢。
链接: