回放可以记录每一步位移,也可以定期保存完整位置。漏掉一条增量后,后面增量即使都收到了,也可能一直带着相同偏差,直到新的绝对位置把状态重新对齐。
以下是一组可按记录复查的虚构游戏例子。它先固定输入、单位和执行顺序,再展示每一步结果。读者可以用纸笔挑出几步核对,不需要依赖具体游戏的后台数据。
二维整数位置,十四拍各有一个位移。接收方只漏掉指定的一拍增量,其余正常累计;在一个较晚拍末收到真实绝对位置并覆盖当前估计。检查点发生在当拍增量处理之后,只有这一个丢失事件。
起点[5, 0],第6拍增量丢失,第11拍末收到绝对位置 十四拍位移[[2, -3], [-4, 2], [-1, -3], [1, -4], [0, 4], [1, -4], [-1, 1], [4, 3], [4, 4], [0, -3], [4, -3], [-2, 4], [-3, 0], [-4, 4]]
第1拍位移[2, -3],接收增量,真实位置[7, -3],接收方[7, -3],估计减真实的误差[0, 0]。
第2拍位移[-4, 2],接收增量,真实位置[3, -1],接收方[3, -1],估计减真实的误差[0, 0]。
第3拍位移[-1, -3],接收增量,真实位置[2, -4],接收方[2, -4],估计减真实的误差[0, 0]。
第4拍位移[1, -4],接收增量,真实位置[3, -8],接收方[3, -8],估计减真实的误差[0, 0]。
第5拍位移[0, 4],接收增量,真实位置[3, -4],接收方[3, -4],估计减真实的误差[0, 0]。
第6拍位移[1, -4],该增量丢失,真实位置[4, -8],接收方[3, -4],估计减真实的误差[-1, 4]。
第7拍位移[-1, 1],接收增量,真实位置[3, -7],接收方[2, -3],估计减真实的误差[-1, 4]。
第8拍位移[4, 3],接收增量,真实位置[7, -4],接收方[6, 0],估计减真实的误差[-1, 4]。
第9拍位移[4, 4],接收增量,真实位置[11, 0],接收方[10, 4],估计减真实的误差[-1, 4]。
第10拍位移[0, -3],接收增量,真实位置[11, -3],接收方[10, 1],估计减真实的误差[-1, 4]。
第11拍位移[4, -3],接收增量,拍末应用绝对检查点,真实位置[15, -6],接收方[15, -6],估计减真实的误差[0, 0]。
第12拍位移[-2, 4],接收增量,真实位置[13, -2],接收方[13, -2],估计减真实的误差[0, 0]。
第13拍位移[-3, 0],接收增量,真实位置[10, -2],接收方[10, -2],估计减真实的误差[0, 0]。
第14拍位移[-4, 4],接收增量,真实位置[6, 2],接收方[6, 2],估计减真实的误差[0, 0]。
检查点后位置重新一致,最终位置[6, 2];丢失记录此前造成的偏差没有靠后续正常增量自行消失。
真实位置等于初始位置加全部前缀增量。丢失以后、检查点以前,估计位置应等于真实位置减去丢失增量;到检查点及以后,两者相同。用前缀求和可独立核对逐拍更新过程。
丢失增量刚好为零时可能没有可见偏差,因此本例特意使用非零丢失位移。检查点只校正此例的位置,不代表动画、道具或随机状态也自动恢复;完整回放需要分别保存它们的必要信息。
练习时只改变一个条件,先判断哪些中间步骤应当受影响,再重新计算。要把空状态、数值零和未能确定的结果分开。边界约定不同可能产生不同答案,复查的目标是确认输入、过程与规则一致,而不是只追求最后一个数字看起来相同。