考虑一个基于时钟的游戏,计算机每个时钟周期需要执行 100 次操作。如果计算机在一个时钟周期内只能执行 50 次操作,会发生什么情况?
答案1
这取决于计算机的工作原理。当时,视频游戏的运行速度与处理器的速度一样快。为计算机设计的同一款视频游戏,如果在两倍快的计算机上玩,运行速度也会快两倍。因此,为了避免这个问题,计算机配备了“Turbo”按钮,它可以限制 CPU 的速度,以便游戏可以玩(想象一下以 500 倍的速度玩俄罗斯方块)。
你可以通过实际行动明白我的意思这里,其中的那个家伙正在玩这个 Gameboy 的时钟。
如今,一款像样的电子游戏会检查时间,并根据时间来调整移动汽车的位置。因此,如果我们处于某个特定的时间点,而下一个时间点已经过去了 2 秒……那么,根据汽车的速度,我们可以计算出它现在应该在哪里。
在第一种情况下,游戏运行慢点。在第二种情况下,游戏运行速度很快,但更加动荡。
现在如果你的问题确实是“我没有降低游戏速度,也没有降低帧率,也没有做任何事情来避免 CPU 无法完成所有任务的情况。时间到了,tick 就结束了,一切重新开始。会发生什么?”
好吧,如果游戏循环是这样的:
- 接受控制器输入。
- 计算移动物体位置
- 计算碰撞
- 绘制场景和大多数角色
- 计算损失
- 绘制玩家模型
- 绘制球员服装。
并且 CPU 只能达到 6.5 点,那么您最终会看到一个赤身裸体、没有腿的角色,但游戏可以照常进行(或崩溃)。
如果 CPU 刚好超过 4,那么碾过您的汽车就不会撞死您,而只是从您身边穿过。
当然,这取决于游戏的实现,而我的想象力太丰富了。
答案2
考虑一个基于时钟的游戏,计算机每个时钟周期需要执行 100 次操作。如果计算机在一个时钟周期内只能执行 50 次操作,会发生什么情况?
取决于滴答声到期时发生的情况以及操作是什么。
如果您的游戏采用类似 Visual Basic 的程序,其中计时器事件会触发操作,并且您的操作是运行游戏的过程,那么在“滴答”结束时,计时器将再次触发该过程。
除非您另作安排,否则现有运行程序将继续运行。将出现“重叠”。如果您的代码不是“可重入的”——即在整个过程中使用静态变量,变量的意外更改将导致第一个运行程序和第二个运行程序同时运行。这将导致程序行为异常。
如果您使用的语言或框架在“tick”或计时器事件发生时终止第一个正在运行的程序,然后再启动另一个程序,那么显然该tick中应该完成的所有操作都不会完成。如果在tick结束时需要更新下一个tick所依赖的某些变量,则该程序将无法按预期工作。
在旧计算机或游戏系统上,“滴答”通常是视频芯片在渲染视频时到达某行时生成的 IRQ 或 NMI。如果好的游戏“超载”并且无法在滴答或“帧”内完成工作,它们会记住这一事实,可能通过使用在每帧开始时检查的标志,并继续工作,导致速度变慢但不会导致失败。当工作完成后,标志会被清除。这必须在每个“滴答”开始时进行检查。