4.1 延迟的代价:为什么 100ms 能毁掉手感

延迟的三笔账

一个「按下 W → 角色动」的简单操作,在网络上要付三笔时间税:

  1. 上行延迟:输入从客户端到服务器(ping 的一半)
  2. 服务器处理:等下一个网络 tick(tick 间隔通常是 1/30~1/60 秒)
  3. 下行延迟:结果从服务器发回客户端(ping 的另一半)

Ping 100ms(国内手游很常见)时,做一次「等服务器再响应」的操作,往返就是 100ms+ tick 延迟。人眼对 50ms 以上的操作延迟已经敏感,100ms 以上就是「黏糊糊」的臭手感。

三种应对策略

策略 做法 代表场景
等服务器(无预测) 所有操作等服务器回包 严格回合制、交易确认
客户端预测 + 服务器校正 本地先执行,服务器主导权威 移动、大多数动作
服务器权威 + 表现预测 逻辑服务器走,表现层本地猜 受击表现、技能特效时机

选择原则:操作频率越高、对即时反馈越敏感,越要预测。一次性的重要操作(买装备、确认交易)反而应该等服务器——预测错了再回滚,玩家会觉得「系统坑我」。

「手感」的量化

延迟对手感的影响不是线性的,有几个经验阈值:

往返延迟 玩家感知
< 30ms 无感(局域网/同城)
30~80ms 正常体验,竞技游戏可接受上限
80~150ms 动作游戏开始难受,策略游戏无感
> 150ms 没有预测的实时操作不可玩

注意:预测能让 150ms 的网络感觉像 20ms——预测不是消除延迟,而是把延迟从「操作反馈」里搬到「校正发生的时刻」,而校正确实可以被做得不起眼。

同步频率与感觉的关系

服务器以 NetUpdateFrequency 推送位置。30Hz 推送意味着客户端每 33ms 才收到一次「真实」位置——如果客户端直接用这个位置渲染,角色就是每秒 30 帧的瞬移感。插值平滑(4.3)负责把这 30Hz 的离散补成 60 帧的连续画面。这个「补帧」就是为什么远程玩家的动作看着流畅——它在渲染的是「略带延迟的插值位置」,不是最新真实位置。

带宽与平滑度的权衡

提高 NetUpdateFrequency → 远程角色更平滑(插值误差小),但服务器上行带宽成本线性增长。企业项目常见配置:

  • 玩家角色:30~50Hz(配合插值,肉眼看不出离散)
  • 战斗中重要的投射物:20~30Hz(速度快,插值误差大,可适当提高)
  • NPC/怪物:10~20Hz
  • 远景/静态对象:1~5Hz 或休眠

心得:永远在「目标延迟」下做手感决策。先用网络仿真把延迟稳定在目标值(比如手机端按 120ms 算),再调预测和插值参数——在零延迟的开发环境下调出来的手感,上线必崩。