联机位置缓存为什么要区分采样时间和到达时间:两档回放延迟的十次位置查询(实例05)
位置记录可能产生得早却到得晚。画面回放某个过去时刻时,应从当前已经收到的记录中按采样时间寻找两侧数据,而不是把到达顺序直接当成运动顺序。
先固定规则与数据
双方时钟在本例中已经对齐。查询目标时刻为当前时刻减回放延迟;只使用已经到达的快照。两侧都有记录时线性插值,否则停在最早或最晚可用记录,完全未收到时显示空。
快照0: 采样0,到达5,位置-15 快照1: 采样10,到达16,位置9 快照2: 采样20,到达27,位置64 快照3: 采样30,到达39,位置2 快照4: 采样40,到达61,位置-8 快照5: 采样50,到达70,位置-12
逐项记录过程
延迟8,当前时刻0,目标-8;已到快照[],方式empty,采用[],显示位置None。
延迟8,当前时刻8,目标0;已到快照[0],方式hold-first,采用[0],显示位置-15。
延迟8,当前时刻16,目标8;已到快照[0, 1],方式interpolate,采用[0, 1],显示位置21/5。
延迟8,当前时刻24,目标16;已到快照[0, 1],方式hold-last,采用[1],显示位置9。
延迟8,当前时刻32,目标24;已到快照[0, 1, 2],方式hold-last,采用[2],显示位置64。
延迟8,当前时刻40,目标32;已到快照[0, 1, 2, 3],方式hold-last,采用[3],显示位置2。
延迟8,当前时刻48,目标40;已到快照[0, 1, 2, 3],方式hold-last,采用[3],显示位置2。
延迟8,当前时刻56,目标48;已到快照[0, 1, 2, 3],方式hold-last,采用[3],显示位置2。
延迟8,当前时刻64,目标56;已到快照[0, 1, 2, 3, 4],方式hold-last,采用[4],显示位置-8。
延迟8,当前时刻72,目标64;已到快照[0, 1, 2, 3, 4, 5],方式hold-last,采用[5],显示位置-12。
延迟16,当前时刻0,目标-16;已到快照[],方式empty,采用[],显示位置None。
延迟16,当前时刻8,目标-8;已到快照[0],方式hold-first,采用[0],显示位置-15。
延迟16,当前时刻16,目标0;已到快照[0, 1],方式hold-first,采用[0],显示位置-15。
延迟16,当前时刻24,目标8;已到快照[0, 1],方式interpolate,采用[0, 1],显示位置21/5。
延迟16,当前时刻32,目标16;已到快照[0, 1, 2],方式interpolate,采用[1, 2],显示位置42。
延迟16,当前时刻40,目标24;已到快照[0, 1, 2, 3],方式interpolate,采用[2, 3],显示位置196/5。
延迟16,当前时刻48,目标32;已到快照[0, 1, 2, 3],方式hold-last,采用[3],显示位置2。
延迟16,当前时刻56,目标40;已到快照[0, 1, 2, 3],方式hold-last,采用[3],显示位置2。
延迟16,当前时刻64,目标48;已到快照[0, 1, 2, 3, 4],方式hold-last,采用[4],显示位置-8。
延迟16,当前时刻72,目标56;已到快照[0, 1, 2, 3, 4, 5],方式hold-last,采用[5],显示位置-12。
empty表示尚未收到记录,hold-first与hold-last表示停在缓存边界,interpolate才表示确有两侧数据。本例不把缓存边界之外的运动外推成已经确认的位置。
独立复核的方法
逐次列出可用快照与实际采用的两条记录。迟到记录可以插回按采样时间排序的位置,但不能在它真正到达前使用。比较不同回放延迟时,要同时注意等待和缺少未来一侧记录的情况。
建议先按原始数据自己算一遍,保留中间状态后再与本例对照。发生分歧时,先寻找最早不同的步骤,检查边界是否包含、编号与坐标方向是否一致,以及状态是在事件之前还是之后更新。最终结果相同并不能替代对过程规则的理解,修改输入后也需要重新核算。
使用范围
这是理想化的一维位置模型,没有时钟漂移、丢包、预测或服务器校正。更大的延迟可能提供更多插值余量,却也让画面离最新状态更远;本例不提供通用的最佳毫秒数。