4.1 延迟的代价:为什么 100ms 能毁掉手感
延迟的三笔账
一个「按下 W → 角色动」的简单操作,在网络上要付三笔时间税:
- 上行延迟:输入从客户端到服务器(ping 的一半)
- 服务器处理:等下一个网络 tick(tick 间隔通常是 1/30~1/60 秒)
- 下行延迟:结果从服务器发回客户端(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 算),再调预测和插值参数——在零延迟的开发环境下调出来的手感,上线必崩。
