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

游戏卡顿白皮书 › L1 客户端游戏进程

没有插值缓冲或缓冲过短 Missing/short interpolation buffer

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

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

收到服务器数据包就立刻绘制,抖动(到达间隔的波动)会原样暴露在画面上。

起因 收到的位置直接绘制,或缓冲比抖动短 → 结果 数据包晚到多久就停多久,扎堆到达就跳一下 → 画面表现 其他角色一顿一顿地移动

症状
一卡一卡
因素
抖动
谁会遇到
只有我
何时出现
一直
负责方
主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
研发团队要做的事
客户端:设置插值缓冲,并根据线路状况自动调节缓冲长度。服务器:采用延迟补偿(回溯判定),让玩家对着缓冲时长之前的画面射击也能正确判定。
数值参考
通常把服务器发包间隔的 2 倍左右(每秒收 20 次就是 100 ms)作为缓冲。
监控图上
一直偏高 · 数据包到达间隔、插值缓冲被取空的次数
查看位置
在客户端记录服务器数据包到达间隔的分布,以及因为没有下一张可插值的快照而停住或转为外推的帧数
确认依据
到达间隔的波动经常超过插值缓冲长度,每次缓冲被取空,其他角色就顿一下。加大缓冲后减少
排除依据
缓冲足够仍然顿一下,检查服务器的发送间隔本身是否不规律(tick 延迟)
确认手段
需要游戏服务器/客户端的日志和指标
深入了解
缓冲加大后画面更平滑,但看到的对手也相应是过去的样子。所以攻击判定要配合延迟补偿:服务器回溯到“那个人当时看到的过去”再确认。

出处

  1. Interpolation and extrapolation (Netcode for Entities 6.5) Unity
    缓冲插值:为等待晚到的数据包故意延后绘制;缓冲越大越准确,但延迟也随之增加
  2. Struct ClientTickRate (Netcode for Entities 6.5) Unity
    插值缓冲默认值 InterpolationTimeNetTicks = 2(服务器发送 2 次的量)
  3. Physics (Netcode for Entities 6.5) Unity
    延迟补偿:服务器找出客户端在那个 tick 看到的碰撞世界,据此判定是否命中

相关原因

同一层:L1 客户端游戏进程

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

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