
客户端预测
客户端预测在玩家按下按键的瞬间就在本地运行模拟,而不是等待服务器确认。这使得移动感觉是即时的。当服务器的权威状态到达且不一致时,客户端会进行调和以与之匹配。这种调和就是产生肉眼可见修正的原因。
又称
预测
,
客户端预测的是什么?
主要是玩家所控制的对象。当按下按键时,客户端会运行与服务器相同的游戏代码,并立即显示结果:角色移动、镜头旋转、武器动画播放。输入仍会发送到服务器,而服务器对发生的一切仍拥有最终决定权。
还有哪些内容会被预测,取决于游戏和网络代码。许多库会预测本地玩家控制的内容,并在服务器更新之间绘制其他所有人,这就是插值。Unreal 的 Character Movement Component 就是这样工作的,而 Unity 的 Netcode for Entities 将其作为“所有者预测”模式提供,介于完全预测和完全插值对象之间(Unity 文档)。格斗和体育游戏通常会预测每个玩家,玩家需要躲避的投掷物也经常会被预测(SnapNet)。
某些结果通常留给服务器决定:子弹是否击中他人、造成了多少伤害、谁先抢到了有争议的道具。客户端可以立即显示击中标记,但服务器决定其是否有效。这就是为什么预测不会将决定权交回给客户端。预测的猜测会显示在屏幕上,但绝不会被视为既定事实。
文章的核心洞察
不同步是分歧,而非延迟:滞后(Lag)意味着信息到达较晚。不同步(Desync)意味着两台机器保存着相同世界的不同版本,这是一个具有独立解决方案的独立故障。
存在两种截然不同的类型:复制不同步(Replication desync),即权威服务器纠正预测错误的客户端;以及确定性不同步(Determinism desync),即对等端模拟产生分歧,导致会话直接停止。
“橡皮筋”效应有两个控制杠杆:客户端预测错误的频率(由延迟决定),以及每次纠正的明显程度(由网络代码决定)。调整其中任何一个,玩家看到的“橡皮筋”现象都会减少。
tick 率并不是这两个杠杆之一:提高 tick 率并不会使预测更准确,而且在已经丢包的连接上,它反而会使画面异常情况更加严重。
“发生不同步”是校验和失败:帧同步(Lockstep)游戏在每回合都会比较状态哈希值,因此一个分歧的浮点数或一个未同步的随机调用都会导致会话终止。
服务器对账是如何工作的?
客户端的预测与服务器的确认总是相差一个往返时间(RTT)。当服务器对某次输入的结果送达时,玩家已经按下了更多的按键。而和解(Reconciliation)机制能在不丢弃这些按键输入的前提下,将两者重新统一起来。
为每个输入编号。客户端为每个输入标记一个序列号,并保留一份副本。
服务器返回编号进行确认。服务器的更新包中携带了当前状态以及它所处理的最后一个输入的编号。
重置与重放。客户端重置为服务器的状态,然后重新应用服务器尚未处理的每一个输入,从而使其回到当前时间点(Gabriel Gambetta, Fast-Paced Multiplayer)。
Unreal 的移动系统通过“保存的动作”(saved moves)遵循相同的步骤:服务器重新运行每个动作,在结果不一致时发送修正,然后客户端从该点开始重放其保存的动作(Epic 文档)。SnapNet 按帧描述了相同的循环:在第 1 帧发送输入,在第 4 帧收到确认,然后“将客户端的模拟回滚到第 1 帧的结果,重新模拟第 2 帧和第 3 帧,最后模拟新的一帧”(SnapNet)。
当中预测正确时,重放的结果正好落在玩家当前所在的位置,因此不会发生任何肉眼可见的闪烁。如果没有重放,角色在每次更新时都会被拉回到服务器较旧的位置。
为什么预测的玩家会被修正?
因为客户端在进行预测时缺少了服务器所掌握的信息:比如有另一个玩家挡在路上、击退效果,或者由于数据包丢失而导致服务器从未收到某项输入。纠正的表现就是角色发生瞬移或向后滑动,玩家称之为回弹(rubberbanding)。
往返时间决定了可能出错的程度。在每秒 60 次模拟步骤下,一个步骤大约持续 16.7 毫秒,因此 30 毫秒的往返时间意味着大约有两个步骤在服务器上等待,而 180 毫秒的往返时间则意味着大约有十一个步骤在等待。未确认的步骤越多,意味着猜测出错的概率越大,出错时的纠正幅度也越大。
网络代码可以缓解这一问题。纠正可以在几帧内平滑过渡,而不是直接瞬移,并且一些库会在延迟上升时增加输入延迟,从而减少客户端需要预测的内容。在 SnapNet 的默认设置下,“当玩家的延迟超过 150 毫秒时,他们的控制会逐渐变得迟钝,但游戏仍可正常进行。”每种技术都有其代价:平滑处理会短暂显示错误的位置,输入延迟会降低控制的响应速度,而重新播放更多步骤则会“带来沉重的 CPU 负担” (SnapNet)。
来自我们的赞助商(其实就是我们自己!)的寄语
大多数延迟来自距离,而非代码。Edgegap 的边缘云是一个分布式网络,按需提供高达 615+ 个可用位置,因此每场比赛都能在最适合玩家的可用位置运行。对直播工作室流量的独立重放测试表明,与公共云相比,平均往返时间减少了 58%。
Edgegap 的观点(仅代表个人意见,姑且听之即可!)
更小的偏差,更公平的匹配
预测在需要猜测的内容较少时效果最好。往返时间的每一毫秒都是客户端领先于服务器运行的时间,而该窗口中的每一次输入都可能是服务器会进行修正的。缩短往返时间,修正往往会变得更小、更少,无论游戏使用的是什么网络代码。
距离也决定了公平性。对于相同的操作,距离服务器 150 毫秒的玩家比距离服务器 20 毫秒的玩家更容易受到修正。在最适合所有玩家的位置启动每场比赛的服务器可以缩小这一差距:与公共云中继部署相比,专用服务器部署实现的平均延迟减少了 58%(平台数据,2026 年 9 月 18 日)。
《以太之战 2》(Rivals of Aether 2)将 SnapNet 的预测和回滚功能与部署在靠近每场比赛玩家位置的服务器相结合,其 Ping 值目标低于 20 毫秒。这篇案例研究展示了具体方法。
,










