我已经出拳了,迟到的输入还能改写哪一帧?
从《时空幻境》的倒带,走到格斗游戏的回滚,再看《光环:致远星》中的一枚手榴弹。三次屏幕上的动作,分别要求我们记住过去、修订预测和等待主机裁决。
先问过去能不能找回来
先想一个单机问题。你在《时空幻境》踩错一步,按住倒带键,松手时要能从那一刻重新行动。截一张图可以重现画面,却交代不了怪物接下来的运动。Blow 的方案先保证能恢复世界状态,再压缩存储:读出基准帧,再用差异块里记录的字段值恢复目标状态。这里过去已经发生,难处是把它找回来。
原文与时间戳 · 2
record the full state of the world, because you know that's robust. You know you can reproduce that.I have to decode what's in the base frame. And then I have to apply the diffs to the base frame.同一个过去,换一份输入再跑一次
把第二位玩家搬到网络另一端。在本机看到对手站立的那一帧,对手按下的格挡可能还在路上。格斗游戏的回滚做法是先推进,待真实输入到达,必要时恢复此前的状态,用这份输入重新算到现在。和单机倒带相比,多出来的任务是修订刚才预测过的历史。重算中的每一帧服务于模拟,最终呈现给玩家的才需要完整渲染。
原文与时间戳 · 2
The game will proceed without remote input, and when remote input is received, we will roll back and then simulate forward.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.手可以先动,手榴弹要等谁?
《光环:致远星》给出了另一种边界。扣下扳机,自己的投掷动作马上开始;决定一枚会伤到别人的手榴弹是否已经飞出去,则要等主机。到释放帧,本机先把道具从手中隐藏,空中的投射物随后按主机确认出现。把一次操作拆开,延迟就能落在不同环节。把三个案例放在一起,请为你设计的动作各写一个答案:哪部分只需看起来及时?哪部分能用输入重算?哪一步发生后其他人就必须承认其结果?
原文与时间戳 · 2
we predict the throw animation. So as soon as you push the trigger button on a client machine, you immediately begin your throw.But we do not predict the grenade release. We wait for the host. This means that all grenades in flight will be real.连上了同一场游戏,谁有权决定状态?
讨论迟到的输入之前,还要先决定谁有权提交游戏状态。Brevik 回忆,初代 Battle.net 主要帮助玩家建立连接,实际游戏由玩家机器彼此通信,因此中心服务的负担很轻。相同的分工也把可修改的状态留给客户端。他们知道个别玩家可以作弊,却低估了作弊工具被传播后的影响,于是续作转向客户端—服务器架构。把它放在回滚与主机裁决旁边看,两个问题就分开了:回滚解决「晚到的信息怎样修正过去」,权威边界解决「谁送来的信息能算数」。网络延迟消失,也不会自动消除客户端伪造状态的机会。
原文与时间戳 · 2
we just handled the kind of these connectionsgoing client-server and for Diablo 2 was definitely necessary读完再想一步
画一条三帧的时间线:我按键,本机显示动作,对手的消息到达。如果两端判断不同,圈出要恢复的状态、要重放的输入,以及其他人可以信任的那一帧。