迟到输入到达后怎样从旧状态重新计算:独立观察第08例
联机预测中,画面可能已经模拟了尚未收到真实输入的几拍。收到不同的输入后,只修改当前位置会忽略它对后续速度和位置的持续影响。
本例先把十拍未知加速度都预测为零,保留每拍开始前的状态。每拍先更新速度再更新位置。之后按指定顺序收到这十拍的真实输入;某拍值改变时,从那拍开始前的快照重新计算到第十拍。
输入与计算记录
起始位置和速度[2, -2],真实十拍加速度[-1, 1, -1, -1, 0, 1, 0, -1, 0, -1];到达拍号顺序[7, 1, 10, 3, 5, 6, 8, 2, 9, 4]。初次全零预测的十拍末状态为[-18, -2]。
收到拍号 | 真实值 | 是否改变预测 | 重算拍数 | 十拍末位置/速度 7 | 0 | False | 0 | [-18, -2] 1 | -1 | True | 10 | [-28, -3] 10 | -1 | True | 1 | [-29, -4] 3 | -1 | True | 8 | [-37, -5] 5 | 0 | False | 0 | [-37, -5] 6 | 1 | True | 5 | [-32, -4] 8 | -1 | True | 3 | [-35, -5] 2 | 1 | True | 9 | [-26, -4] 9 | 0 | False | 0 | [-26, -4] 4 | -1 | True | 7 | [-33, -5]
阅读记录时先确认编号代表的是格子、对象、时间还是数组位置,再逐项对应输入与输出。中间状态提供了定位差异的依据,最后的一个合计数字不能替代全部步骤;没有对象的集合与数值零也应区别看待。
怎样检查这个结果
重算时使用已经收到的其他输入,仍未知的拍继续用零。更早的快照不应因后来的修正而改变;全部输入到齐后,最终状态必须与从头使用真实输入模拟的结果一致。
这里把全部收包安排在十拍预测结束之后,方便逐条观察回滚,没有网络超时、丢包和渲染平滑。真实系统还需要限制历史长度并处理无法回滚的副作用,不能直接把位置重算当成完整联机方案。
可以遮住结果表先按规则复算第一步,再选择一个边界输入重复操作。若更换规则中的任一前提,应重新推导结果,不要只调整最后答案。这样既能理解本例为何成立,也能看清它在哪些情况下不再适用。
