HackerTube English?
软件边界与变化 →

我已经出拳了,迟到的输入还能改写哪一帧?

从《时空幻境》的倒带,走到格斗游戏的回滚,再看《光环:致远星》中的一枚手榴弹。三次屏幕上的动作,分别要求我们记住过去、修订预测和等待主机裁决。

本文的问题 · 4
  1. 先问过去能不能找回来
  2. 同一个过去,换一份输入再跑一次
  3. 手可以先动,手榴弹要等谁?
  4. 连上了同一场游戏,谁有权决定状态?

先问过去能不能找回来

先想一个单机问题。你在《时空幻境》踩错一步,按住倒带键,松手时要能从那一刻重新行动。截一张图可以重现画面,却交代不了怪物接下来的运动。Blow 的方案先保证能恢复世界状态,再压缩存储:读出基准帧,再用差异块里记录的字段值恢复目标状态。这里过去已经发生,难处是把它找回来。

原文与时间戳 · 2
record the full state of the world, because you know that's robust. You know you can reproduce that.
The Implementation of Rewind in Braid · ▶ 5:06–5:11
I have to decode what's in the base frame. And then I have to apply the diffs to the base frame.
The Implementation of Rewind in Braid · ▶ 13:30–13:36

同一个过去,换一份输入再跑一次

把第二位玩家搬到网络另一端。在本机看到对手站立的那一帧,对手按下的格挡可能还在路上。格斗游戏的回滚做法是先推进,待真实输入到达,必要时恢复此前的状态,用这份输入重新算到现在。和单机倒带相比,多出来的任务是修订刚才预测过的历史。重算中的每一帧服务于模拟,最终呈现给玩家的才需要完整渲染。

原文与时间戳 · 2
The game will proceed without remote input, and when remote input is received, we will roll back and then simulate forward.
8 Frames in 16ms: Rollback Networking in Mortal Kombat and Injustice 2 · ▶ 8:48–8:53
The simulated frames are the ones that you simulate forward with a stripped down version of the game to get back to the current tick.
8 Frames in 16ms: Rollback Networking in Mortal Kombat and Injustice 2 · ▶ 14:31–14:38

手可以先动,手榴弹要等谁?

《光环:致远星》给出了另一种边界。扣下扳机,自己的投掷动作马上开始;决定一枚会伤到别人的手榴弹是否已经飞出去,则要等主机。到释放帧,本机先把道具从手中隐藏,空中的投射物随后按主机确认出现。把一次操作拆开,延迟就能落在不同环节。把三个案例放在一起,请为你设计的动作各写一个答案:哪部分只需看起来及时?哪部分能用输入重算?哪一步发生后其他人就必须承认其结果?

原文与时间戳 · 2
we predict the throw animation. So as soon as you push the trigger button on a client machine, you immediately begin your throw.
I Shot You First: Networking the Gameplay of Halo: Reach · ▶ 31:51–32:00
But we do not predict the grenade release. We wait for the host. This means that all grenades in flight will be real.
I Shot You First: Networking the Gameplay of Halo: Reach · ▶ 32:03–32:10

连上了同一场游戏,谁有权决定状态?

讨论迟到的输入之前,还要先决定谁有权提交游戏状态。Brevik 回忆,初代 Battle.net 主要帮助玩家建立连接,实际游戏由玩家机器彼此通信,因此中心服务的负担很轻。相同的分工也把可修改的状态留给客户端。他们知道个别玩家可以作弊,却低估了作弊工具被传播后的影响,于是续作转向客户端—服务器架构。把它放在回滚与主机裁决旁边看,两个问题就分开了:回滚解决「晚到的信息怎样修正过去」,权威边界解决「谁送来的信息能算数」。网络延迟消失,也不会自动消除客户端伪造状态的机会。

原文与时间戳 · 2
we just handled the kind of these connections
'Diablo': A Classic Game Postmortem · ▶ 57:55–57:57
going client-server and for Diablo 2 was definitely necessary
'Diablo': A Classic Game Postmortem · ▶ 39:35–39:38

读完再想一步

画一条三帧的时间线:我按键,本机显示动作,对手的消息到达。如果两端判断不同,圈出要恢复的状态、要重放的输入,以及其他人可以信任的那一帧。