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

游戏卡顿白皮书 › 同步设计

没有时间戳、一到就播放 Events played on arrival (no timestamps)

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

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

服务器事件不附带发生时刻、一收到就播放时,网络抖动会原封不动地让表现时机忽快忽慢。

起因 “开始攻击”“播放特效”事件一到就执行 → 结果 每个数据包到达时间不同,间隔忽长忽短 → 画面表现 连续攻击动作时快时慢,BOSS 技能时机每次都不一样

症状
一卡一卡, 快进
因素
抖动
谁会遇到
只有我
何时出现
一直
负责方
主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
研发团队要做的事
客户端:按事件附带的时间播放(定时事件、插值缓冲)。服务器:给事件附上发生时刻(服务器时间)再发送。
监控图上
偶发随机尖峰 · 事件播放间隔,数据包到达间隔
查看位置
把服务器日志中的事件发生时刻与客户端日志中的到达、播放时刻按事件编号对齐,比较间隔。在开发版本中加入抖动(tc netem 的抖动值、Unreal 网络模拟的最小/最大延迟)来复现
确认依据
服务器上的发生间隔均匀,播放间隔却原样跟着到达间隔忽长忽短
排除依据
到达间隔均匀,播放却忽快忽慢,是客户端帧的问题(帧耗时尖峰)。服务器上的发生间隔就已经在波动,则是 tick 超出预算
确认手段
需要游戏服务器/客户端的日志和指标

出处

  1. Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
    每次更新都附上服务器时间,按当前时间减去插值时间(100 ms)得到的目标时刻的位置绘制
  2. Snapshot Interpolation Gaffer On Games
    收到快照就立即绘制,会因抖动而一卡一卡;先在插值缓冲里攒一会儿再绘制,就很流畅
  3. NetworkTime and ticks (Netcode for GameObjects 2.5) Unity
    在 RPC 中放入发送时刻,接收方按服务器时间播放效果的示例
  4. tc-netem(8) — Linux manual page iproute2
    给发出的数据包加入延迟、抖动(delay TIME JITTER)和丢包(loss random PERCENT),模拟真实网络的测试工具
  5. Using Network Emulation in Unreal Engine Epic Games
    在服务器、客户端上加入最小/最大延迟和丢包比例做测试,控制台中用 NetEmulation.PktLag 这类命令设置

相关原因

同一层:同步设计

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

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