当计算机不能及时执行程序时会发生什么

当计算机不能及时执行程序时会发生什么

考虑一个基于时钟的游戏,计算机每个时钟周期需要执行 100 次操作。如果计算机在一个时钟周期内只能执行 50 次操作,会发生什么情况?

答案1

这取决于计算机的工作原理。当时,视频游戏的运行速度与处理器的速度一样快。为计算机设计的同一款视频游戏,如果在两倍快的计算机上玩,运行速度也会快两倍。因此,为了避免这个问题,计算机配备了“Turbo”按钮,它可以限制 CPU 的速度,以便游戏可以玩(想象一下以 500 倍的速度玩俄罗斯方块)。

你可以通过实际行动明白我的意思这里,其中的那个家伙正在玩这个 Gameboy 的时钟。

如今,一款像样的电子游戏会检查时间,并根据时间来调整移动汽车的位置。因此,如果我们处于某个特定的时间点,而下一个时间点已经过去了 2 秒……那么,根据汽车的速度,我们可以计算出它现在应该在哪里。

在第一种情况下,游戏运行慢点。在第二种情况下,游戏运行速度很快,但更加动荡

现在如果你的问题确实是“我没有降低游戏速度,也没有降低帧率,也没有做任何事情来避免 CPU 无法完成所有任务的情况。时间到了,tick 就结束了,一切重新开始。会发生什么?”

好吧,如果游戏循环是这样的:

  1. 接受控制器输入。
  2. 计算移动物体位置
  3. 计算碰撞
  4. 绘制场景和大多数角色
  5. 计算损失
  6. 绘制玩家模型
  7. 绘制球员服装。

并且 CPU 只能达到 6.5 点,那么您最终会看到一个赤身裸体、没有腿的角色,但游戏可以照常进行(或崩溃)。

如果 CPU 刚好超过 4,那么碾过您的汽车就不会撞死您,而只是从您身边穿过。

当然,这取决于游戏的实现,而我的想象力太丰富了。

答案2

考虑一个基于时钟的游戏,计算机每个时钟周期需要执行 100 次操作。如果计算机在一个时钟周期内只能执行 50 次操作,会发生什么情况?

取决于滴答声到期时发生的情况以及操作是什么。

如果您的游戏采用类似 Visual Basic 的程序,其中计时器事件会触发操作,并且您的操作是运行游戏的过程,那么在“滴答”结束时,计时器将再次触发该过程。

除非您另作安排,否则现有运行程序将继续运行。将出现“重叠”。如果您的代码不是“可重入的”——即在整个过程中使用静态变量,变量的意外更改将导致第一个运行程序和第二个运行程序同时运行。这将导致程序行为异常。

如果您使用的语言或框架在“tick”或计时器事件发生时终止第一个正在运行的程序,然后再启动另一个程序,那么显然该tick中应该完成的所有操作都不会完成。如果在tick结束时需要更新下一个tick所依赖的某些变量,则该程序将无法按预期工作。

在旧计算机或游戏系统上,“滴答”通常是视频芯片在渲染视频时到达某行时生成的 IRQ 或 NMI。如果好的游戏“超载”并且无法在滴答或“帧”内完成工作,它们会记住这一事实,可能通过使用在每帧开始时检查的标志,并继续工作,导致速度变慢但不会导致失败。当工作完成后,标志会被清除。这必须在每个“滴答”开始时进行检查。

相关内容