한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › 只有部分人遇到的问题

每个玩家的输入缓冲大小 Per-player server input buffer (jitter buffer)

原因 ID pt-input-buffer · 主责 研发团队·服务器开发 · 配合 研发团队·客户端开发

在含图示和实验的完整版中打开此卡片 →

服务器为每个人先攒一点输入,每个 tick 取出一个使用时,别人看起来很流畅,但本人动作在服务器上确定的时间也会相应推迟。

起因 服务器把网络差的人的输入攒在缓冲里,每个 tick 应用一个 → 结果 缓冲小,就经常被取空,该角色原地站住,或由服务器按最后一个输入推测移动;缓冲大,本人的输入就确定得晚 → 画面表现 缓冲小,别人看到他顿一下;缓冲大,本人的技能结果出得晚(操作延迟)

症状
一卡一卡, 操作延迟
因素
抖动
谁会遇到
只有某个角色看起来异常, 只有我
何时出现
一直
负责方
主责 研发团队·服务器开发 · 配合 研发团队·客户端开发
研发团队要做的事
服务器:按每个人的线路状况自动调整缓冲大小,积压时一次取两个来追赶,指示缓冲经常被取空的玩家的客户端提前发送输入。客户端:按服务器指示把输入稍微提前发送(客户端时间调整)。
数值参考
各游戏不同,通常是 1~3 个 tick 的量。VALORANT 在 128 tick 服务器上把服务器缓冲保持得更短,平均半帧(约 4 ms)。常见做法是自适应,只给抖动大的人加大缓冲。
监控图上
仅部分偏高 · 各玩家的输入缓冲长度、取空次数
查看位置
在服务器上按玩家记录每个 tick 输入缓冲中剩余的输入数、缓冲取空后按最后一个输入推测填补的次数、从输入到达到应用的耗时
确认依据
缓冲小的人取空次数多,此时在别人画面上短暂停顿;缓冲大的人,从输入到应用的耗时增加了缓冲长度那么多
排除依据
缓冲几乎没被取空,别人画面上却看到一卡一卡,是观看者一侧的插值问题。缓冲很短操作延迟仍然大,是 RTT 本身或双重 tick 等待
确认手段
需要游戏服务器/客户端的日志和指标

出处

  1. Peeking into VALORANT's Netcode Riot Games
    服务器调整客户端的时间基准,让输入队列保持在延迟最小、又刚好能吸收不均匀到达的长度。服务器缓冲的目标是平均半帧
  2. NetworkTimeSystem class (Netcode for GameObjects 2.5) Unity
    LocalBufferSec:服务器缓冲客户端消息的时长。把客户端时间往前调,消息就能更早到达服务器
  3. NetworkTime and ticks (Netcode for GameObjects 2.5) Unity
    线路差的玩家可以加大缓冲值

相关原因

同一层:只有部分人遇到的问题

其他层中同样导致“一卡一卡”的原因

查看含图示和实验的原卡片