游戏画面每次刷新,并不意味着物理世界也恰好完成一次新计算。Godot官方文档仓库的物理插值介绍,首先区分physics ticks与rendered frames:物理按固定节拍推进,渲染则受显示器刷新频率和计算机供帧能力影响,两者未必同频,也未必在同一时刻发生。本篇采用本次实际读取的master文件,不将其冒称为某个固定发行版的逐项保证。

文档给出一个刻意简化的情境:物理每秒计算十次,画面每秒渲染六十帧。物理算出一个新位置后,画面可能连续六帧都使用这个位置,直到下一次物理结果出现。把这些位置沿时间排列,就会呈现一段保持不动、随后突然跳到新位置的阶梯。这里的六帧是原文情境中的关系,并非本文运行游戏测得的卡顿次数;它说明即使画面帧数更多,也不会凭空增加已计算的物理位置。

插值为这段空隙保留了两份信息:当前物理节拍的变换,以及上一节拍的变换。所谓变换不限于位置,还包括旋转与缩放。引擎可以在两个已知状态之间估计供画面显示的中间状态,因此显示更新不必一直停留在某一份离散结果上。官方以线性插值解释这个思路,同时注明实际Godot可能使用更复杂的插值形式;教学算例不能被当成所有内部实现都只采用同一条简单公式。

一个容易忽略的地方,是这两份信息都已经发生。当前master文字明确说,这样估计的是过去一个物理节拍的位置,而不是对象此刻尚未计算出的真实位置。因此,“画面更连续”与“提前知道下一步”分别描述两件事。若整理动画现象,只写“系统补出了新位置”,容易让读者误以为物理模拟已经额外推进;更准确的表达应说明,补的是两个已知变换之间供显示使用的估计。

文档另将未来外推作为对照。外推试图预测对象接下来会在哪里,但对象在节拍期间发生碰撞时,预测可能错误,显示到不可能的位置,随后又跳回修正路径。这个对照解释了插值为何选择已知区间,并不是宣布未来外推在所有游戏中都不可用。本文没有实现两种方案,也没有测量输入延迟、碰撞结果或玩家感受,不能由原文的解释给某个项目直接排定方案。

这套思路还被称为固定时间步插值。原文指出,它也可以用于并非由物理驱动的对象,名称中的“物理”不必被读成唯一对象类别。对游戏引擎资料阅读而言,可以分别描述模拟何时产生状态、画面何时请求显示,以及显示状态依据哪两个已知变换。这样才有条件解释阶梯、连续估计与预测错误各自出现在哪个环节,而不是把它们统称为帧率问题。本篇未采用配置、代码或多人游戏建议,来源首次发布日期未确认。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。