跳到主要内容
实时游戏

本页尚未翻译,当前显示英文版本。

预测自身移动

服务器还没回复,你就先按自己的输入行动;两边不一致时,客户端自行校正。 这里出错的代价只是画面上的一次小幅校正,别无其他,所以在三种预测机制中,只有这一种可以放心地激进一些。

预测重放声明的规则,而不是另一份规则副本

客户端不会并行运行另一套移动实现,它运行的是平台所用的同一个声明模型:模型属于 Locomotion,预测(prediction)只是提前应用它。所以两边在大多数时候结果一致:一套规则,应用两次。

因此,既没有可以调用的“预测”操作,也没有“校正”操作。预测之所以发生,是因为 aspect 声明为可预测。

哪些内容参与预测,按 aspect 声明

是否可预测是实体 aspect 上的一项声明,而不是全局开关:

  • 客户端能自己算出来的 aspect(例如你自己输入驱动下的位置)可以预测。
  • 权威方按客户端没有的规则修改的 aspect 不得预测。客户端推导不出来,硬猜只会造成回滚,玩家看到的就是游戏在“撒谎”。

校正协议,以及决定它的两个数值

your machinethe server input applied at once, locally — the declared rules, run earlythe same inputthe same rules, laterthey agree — nothing happens, and you never knewthey disagree — your client is moved to the server
你的输入立即在本地应用,同样的规则稍后在服务器上运行,只有两边不一致时客户端才校正

权威状态到达时带着它最后应用的输入序号,所以客户端清楚地知道自己缓冲区里还有多少输入未确认。接下来:

  1. 接受权威状态。
  2. 重放缓冲区中排在已确认输入之后的输入。
  3. 把结果与当前已显示的画面对照并校正。

手感取决于两个声明的数值。偏差阈值:低于阈值时平滑校正,高于阈值时客户端直接跳到权威状态并重放。未确认输入缓冲区的上限:溢出并非未定义行为,降级方式由声明给出并且可以观察到,所以网络差的客户端知道自己已经停止预测,而不是悄悄漂移。

偏差只有发生偏差的客户端能观察到,别的客户端看不到。 你能知道自己的预测被校正了、校正了多少,这对调优有用,也能给玩家显示准确的网络状态指示。但你读不到别人的偏差:预测错误的幅度反映的是对方的网络状况,与游戏本身无关。校正在客户端完成,因为其他所有人看到的本来就是权威方的状态。

如果你用过其他方案

  • Unreal 的 Mover 2.0。 结构很熟悉:带 tick 时间戳的输入、移动模型、来自权威方的校正。区别在于模型放在哪里:这里由你声明模型,由平台模拟,所以我们没有提供需要你继承或替换的移动组件。
  • 回滚加重放的 netcode,例如 Photon Fusion。 校正后重放自己未确认的输入,是同一种机制,这里完整支持。特意没有提供的是事后重新运行整个世界,替代做法和原因见 Lag Compensation。

本页不涉及的内容

其他玩家的实体不做预测,只做显示,见显示其他玩家。按射击者的时间线判定射击是服务器端机制,见 Lag Compensation。如果房间的权威模式(authority mode)是外部权威,这三种机制都不适用:tick 归谁运行,预测也就归谁。