云游戏技术专题全层级13 / 30 已发布

网络抖动与丢包对云游戏体验的量化影响及缓解策略

· 0 分钟阅读
网络抖动与丢包:云游戏体验的下限,藏在 P95 里 — 云游戏技术专题

网络抖动与丢包:云游戏体验的下限,藏在 P95 里

排位赛最后十秒,你贴着掩体摸过去,一刀切向对面残血。就在刀锋要碰到的那一帧,画面顿了一下——不是卡死,就是“咯噔”一下,像视频缓冲打了个嗝。等你反应过来,人已经站到你身后了。

你退出游戏,打开测速,45ms,绿的。

这就是云游戏最让人上火的地方:它不给你一个明确的错误码,只给你一股说不清的憋屈。你没法截图举证,只能在群里骂一句“云游戏就是不行”。

问题真不在那个45。平均延迟是“路程有多长”,而让你咯噔的那一下,是“路程忽长忽短”(抖动)和“包裹半路掉了”(丢包)。第03篇我们把延迟拆成七个分量,讲的是均值结构;这一篇讲方差结构和丢失结构。两份数据合起来,才是一份完整的网络体检报告——只看前者,你会得出“网络很好、体验很差”这种自相矛盾的结论。

说句实话,和几个做云游戏体验的朋友聊下来,大家有个共识:团队里九成的精力都花在压平均延迟上,真正劝退玩家的是每小时那几次两百毫秒的尖峰。玩家记不住P50,记得住那一次P99。

这一篇干三件事:把抖动和丢包翻译成玩家能说出口的体感;给出一张“P95抖动/丢包率—游戏品类”的量化映射表,让你拿去当验收标准;最后给一套缓冲区、FEC、重传联动的三档配置。中间会拆Stadia、Parsec、Moonlight三套真实方案,看它们各自怎么在这道坎上做取舍。

先把词翻译成人话。抖动:每一帧数据从服务器发出到你收到,耗时本该稳定,比如一直38ms;但网络里挤、路由跳来跳去,这一帧32ms、下一帧61ms、再下一帧29ms,这个忽快忽慢的幅度就是抖动。丢包:某一帧的数据整个没到,或者到得不完整。

关键在于,玩家不会说“我抖动P95有点高”,他只会说三种话,对应三条完全不同的技术路径。

第一种,追帧感。画面先卡住半拍,然后突然快进一下追上来。这是抖动缓冲被瞬间撑大、再排空造成的。它的阴险之处在于:卡的那半拍里,你的输入还在往服务器送,但画面没跟上,手和眼短暂分家。动作游戏、格斗游戏玩家会立刻怀疑“我明明按了”。

第二种,瞬移感。这多半是丢包。某一帧没到,播放端只能拿上一帧顶着(叫帧保持,或者冻结),等下一帧到了,里面的角色已经移动了一大段。你眼看着对手的模型平滑了一秒,然后“啪”地跳到新位置,像被谁拽了一下。

第三种,糊块感。很多人忽略这个——丢包不总是直接冻画面。视频压缩靠前后帧互相参考,丢一个包,解码器可能让整片区域糊成马赛克、绿块,持续半秒到两秒,直到下一个关键帧(I帧)到来才恢复。RPG、策略游戏还能忍,竞速游戏里你正过弯,画面糊一块,直接上墙。所以I帧间隔(GOP长度)不只是编码参数,它直接决定了你从糊块里爬出来的时间——这是第02篇编码话题在体验侧的直接投影。

把这三件事摆在一起看,你会发现它们的技术诱因、时间尺度、最敏感的品类都不一样:

玩家体感技术诱因典型时间尺度最敏感的品类玩家原话
追帧感抖动缓冲撑大后排空50–300msFPS、格斗、音游“刚才那下我明明按了”
瞬移感丢包导致帧保持100ms–1sFPS、格斗、MOBA“这人怎么瞬移的”
糊块感丢包引发解码错误传播,等I帧0.5–2s竞速、FPS、开放世界“画面怎么花了”

所以拿一个“丢包率小于1%”去验收云游戏,等于用体温计量血压——指标本身没错,量错了对象。

再讲个真实场景。Moonlight加Sunshine这套自托管方案,社区里有个长盛不衰的帖子:“我家里千兆宽带、延迟8ms,为什么还是偶尔卡?”底下老玩家一句话点破:你Wi-Fi是2.4G还是5G?路由器摆在哪?微波炉一开、隔壁邻居刷视频,抖动直接起飞。带宽是你买套餐时的数字,抖动是你家墙和邻居决定的。云游戏体验抖动,大头在最后一公里,不在玩家引以为傲的带宽。

这一层先记住一句话:三种体感,三种修法。用修丢包的办法去修抖动,或者反过来,都是白花钱。

抖动缓冲区的原理一句话能说完:既然帧到达时间忽快忽慢,那我先攒一小把,等齐了,再按稳定节奏匀速吐出去。播放端就顺了。

但这里有个绕不开的反向关系:攒得越多,抹平抖动的手艺越好,端到端延迟也越大。缓冲区里压着5帧,就是5帧的延迟实打实送给玩家。工程上有个粗略的近似:缓冲深度大致要覆盖你想吸收的抖动幅度,1比1的量级——要吸收30ms的抖动,就得准备30ms左右的缓冲。这不是精确公式,但足够你做第一轮估算。

所以抖动缓冲区本质是一笔延迟税:你交多少税,换多少平滑。

策略取向缓冲深度(经验区间)优点代价适合谁
平滑优先60–120ms画面稳,弱网下不崩手感黏,输入回声大RPG、策略、休闲、客厅大屏
低延迟优先10–30ms手感干脆一抖就卡,对Wi-Fi不宽容FPS、格斗、竞速硬核
自适应20–80ms动态折中调不好会来回震荡平台级默认

表里的数值是工程经验区间,适用于家庭宽带、5GHz Wi-Fi这类常见接入,不是行业标准,你按自己用户的网络分布再收窄。

现代方案基本都走自适应,但“自适应”三个字是个坑。你写个抖动估计器,按最近几百毫秒的抖动幅度调深度,听着优雅。问题是抖动常常是阵发性的:你估计器反应太快,邻居家开个下载,缓冲猛地撑到80ms,网络稳了它还没缩回来,玩家手感“木”一阵;反应太慢,真正的尖峰来了没接住,画面照样糊。

行业的常见做法是六个字:扩得快,缩得慢。看到前面堵,提前减速;路况好了,别立刻猛踩油门,因为随时会再堵。给玩家的体验应该是“有点黏,但永远不卡”,而不是“大部分时候很爽,偶尔脸滚键盘”。具体到参数:扩容通常希望在100ms内到位,收缩用2到5秒的时间常数慢慢往回蹭——这两个数是经验值,你得按自己用户的网络分布再调。

还有个容易被忽略的联动:抖动缓冲和码率自适应抢的是同一份延迟预算。第06篇讲过,自适应码率降码率要时间,缓冲区扩深度也要时间,两个同时动作,延迟会叠着涨。做云游戏别把它们当两个独立模块调,得放在一张预算表里算。你有多少延迟预算,先分给谁,再分给谁,这个顺序比单个参数调得多精细更重要。

真实方案怎么选?Stadia偏保守,Parsec偏激进,Moonlight把旋钮交给用户——这三家的完整拆解放在后面案例段,这里先记结论:缓冲深度没有“正确值”,只有“对这个品类、这群用户、这张网的正确值”。

抖动缓冲是在“时间”上做文章,丢包恢复是在“信息”上做文章。玩家丢了一帧怎么办?行业里两个基本流派,性格相反。

ARQ,自动重传请求,理解成“丢了再要”。你发现第37帧没到,通过反向通道告诉服务器“再来一遍37帧”,服务器补发,你收到接着播。逻辑简单,带宽省——只有真丢了才重发。代价是至少多花一个网络往返时间。局域网20ms,无感;跨省公网60ms,等你补到37帧,42帧都快到了,画面上你已经撞墙了。所以ARQ不是不能用在云游戏,是它有个硬条件:剩余缓冲时间得大于一个往返加处理时间,否则救了也白救。

FEC,前向纠错,理解成“多带备份”。服务器不傻等你要,主动多发冗余。比如每10帧额外带1到2帧的纠错信息,丢了1帧,接收端自己算出来,不用回话。杀手锏是不依赖往返、没有额外延迟,本地秒级救回。代价是多占带宽:1%丢包的网络,为了保险可能要准备5%到10%的冗余,移动网络上行吃紧时这笔钱不小。

维度ARQFEC
方向反向请求,一来一回正向冗余,本地恢复
额外延迟至少一个网络往返接近零,只多解码时间
带宽成本低,按需高,常备
擅长整帧丢失、关键帧、低往返网络随机小丢包、往返慢的场景
短板往返大时来不及连续突发丢包算不回来,且占带宽

这俩的关系,打个比方:ARQ像门卫发现快递少了一件,打电话让快递员再送一趟;FEC像你出门顺手多带一把伞,突然下雨也不用回家拿。前者省事但要等,后者要背但不耽误。

云游戏怎么选?答案是别选,轮班。落地大概这么几条:

按帧的重要性分级。I帧和关键参考帧丢了,后面一串都废,值得用FEC加ARQ双保险;普通P帧丢一帧,靠FEC或帧保持顶过去就行,别为它等一个往返。第02篇讲过参考帧结构,这里就是它在传输层的用法。

冗余率动态化。用一个滑动窗口估计当前丢包率,乘个系数(经验上1.5到2倍)算出冗余率,再设上下限,比如最低3%、最高30%。丢包突然涨,冗余跟着涨;网络干净了慢慢退回去,别一直背着30%的带宽走路。

重传请求延迟发。收到丢包信号别立刻喊重传,等半个到一个往返,给FEC一个自己恢复的机会。很多时候FEC已经算回来了,你这一喊反而重复请求。这个技巧在WebRTC系里很常见(第11篇聊过它的重传机制),云游戏把它拿来用没毛病。

重传要去重、要合并。同一个包被多个解码单元依赖,别发多次请求;服务器侧对重传请求做合并,避免一次丢包引发请求风暴。

该放弃就放弃。上面那个硬条件再强调一遍:剩余缓冲时间不够一个往返,ARQ直接关掉,省下带宽给FEC。判断逻辑用自然语言说就是:这帧还能等多久,够不够一来一回,不够就别等。

私有协议在这块的自由度更大,第14篇拆过Parsec、Moonlight这些方案在确认、重传、加密位置上的不同选择——同样一套FEC加ARQ,放在协议栈的哪一层,效果差很多。

前面三层都在讲机制,这一层干一件策划最该干的事:把定性变成可验收的数字。

先说清楚这些数字怎么来的,免得你拿去当圣经。三个来源:一是第03篇梳理过的品类端到端延迟容忍区间(FPS大约50到70ms、格斗更严、竞速80到100ms、RPG和策略宽松得多),抖动和丢包本质上是在吃这份延迟预算;二是公开评测和平台官方网络建议里的经验值,各家云游戏对带宽、丢包、抖动都有推荐门槛;三是第29篇会讲的视听同步研究——大脑对音画不同步的融合窗口大概在正负30ms量级,超过就开始“感觉怪”。下面这些区间是综合这三者给的经验带,用于产品验收和调参起点,不是学术定论。测试方法放在表后面。

抖动 P95FPS / 格斗竞速动作 RPG回合制 / 策略 / 卡牌
小于15ms无感无感无感无感
15–30ms能感觉到追帧,但不影响操作基本无感无感无感
30–50ms明显影响,竞技不可接受开始危险,过弯会慌轻微无感
50–80ms不可玩明显受损开始难受可忍
80–120ms不可玩不可玩难受勉强
大于120ms全品类不可用
丢包率FPS / 格斗竞速动作 RPG回合制 / 策略
小于0.1%基本无感无感无感无感
0.1–0.5%偶有抱怨偶发糊块可忍可忍
0.5–1.5%明显受损危险开始难受可忍
1.5–3%不可玩不可玩勉强可忍
3–5%不可玩不可玩不可玩明显受损
大于5%全品类不可用

两个表要合起来看,因为抖动和丢包是相乘的,不是相加的。抖动大的时候,你的缓冲已经被撑满,留给重传的时间更少;同样1%的丢包,在P95抖动20ms的网络里可能只是偶发糊块,在P95抖动60ms的网络里就是连续瞬移。这也是为什么很多团队单独看每个指标都“达标”,合起来体验却一塌糊涂。

再说测量。抖动别用平均往返时间,要采帧到达间隔或往返时间序列,取P95和P99,窗口给30秒到1分钟,太短会被一次波动带偏。丢包要分两层看:网络层丢包(抓包能看到)和应用层丢帧(解码器发现参考帧缺失),后者才是玩家真正感知到的。测试注入可以用网络损伤工具模拟固定抖动、随机丢包和突发丢包三种模式,别只测随机丢包——真实世界里的丢包经常是成串来的。

主观侧的验证,建议配第10篇那套方法做配对比较:同一段录像,一组加20ms抖动,一组加50ms,让玩家盲选哪个“更能接受”。你会发现玩家的主观阈值往往比你想的更严,尤其是格斗和音游玩家。

这张表的正确用法不是贴墙上,是写进验收清单:新版本上线前,跑一遍弱网矩阵,看目标品类的格子有没有变红。红了就别发,或者先降级。

Stadia:稳定优先,把税交在前面。Stadia当年有两个设计很典型:手柄直接连Wi-Fi、绕过本地设备,目的是砍掉输入段的一截延迟;视频侧则偏保守,连接时做带宽和延迟探测,动态设码率和缓冲深度,弱网下优先保画面不崩。据当年Digital Foundry等公开评测,良好网络下端到端大致在100到150ms量级(不同游戏差别不小),画面稳定性口碑不错,但输入手感被硬核玩家反复吐槽“看着很干净,打起来飘”。设计意图很清楚:客厅大屏、手柄休闲玩家、降低售后麻烦。收益是首次体验一致、弱网不崩;代价是把延迟税交在了手感上。社区里那句“Stadia画面最好,但打FPS不对劲”,基本就是这笔账的注脚。它最后关闭的原因很多(第01篇拆过),但“稳定压过手感”这个取舍,值得每个做云游戏的人重新算一遍。

Parsec:手感优先,缓冲压到薄。Parsec走的是另一头:自研UDP传输、低延迟编码配置、薄抖动缓冲,网络自适应很激进,目标就是把输入回声压到最低。它起家于远程桌面,游戏是顺带做的,所以对“操作跟手”这件事有执念。好网络下它的口碑是“最快”,局域网里几乎接近本地;代价是对烂网络非常不客气,Wi-Fi一抖、丢包一涨,画面花屏和卡顿来得比谁都直接。Reddit上常见的评价是“Parsec快是快,Wi-Fi下容易炸”,这句话很准确——它不是不会处理弱网,是主动选择不为一小部分弱网用户牺牲大多数好网络用户的手感。做产品时这个取舍很值得学:你得知道自己在为谁优化,以及愿意放弃谁。

Moonlight加Sunshine:把旋钮交给用户。这套开源方案逆向自NVIDIA的GameStream协议,跑在局域网为主,编码用硬件编码器,协议里给了FEC百分比、码率、帧节奏这些可调项,让用户自己按网络调。它的收益很实在:局域网里延迟能做到很低,画质码率自己定,HDR、AV1这些新特性社区往往比商业平台先上(第27篇专门聊这个生态)。代价也明显:公网访问要端口转发、打洞或者VPN,安全自己负责;对家庭网络质量极度敏感。社区里“千兆还卡”的帖子,答案十有八九是Wi-Fi信道、路由器性能或者后台下载,而不是带宽不够。Moonlight的意义不在于它比商业平台强,而在于它把“抖动和丢包到底怎么影响体验”这件事,赤裸裸地摆在了用户面前——参数调错一次,你就全懂了。

下面这张表是给工程和策划一起看的。三档覆盖常见网络形态,每档给一组联动参数:缓冲门限、FEC冗余率、重传策略。再次强调,数值是工程经验区间,不是标准答案,适用网络写在第二列,你按自己用户的分布调。

档位适用网络抖动P95门限缓冲目标深度扩容 / 收缩FEC冗余率FEC块结构ARQ策略码率动作
A 家用低延迟有线或5GHz Wi-Fi,往返小于30ms,丢包小于0.5%15ms20–35ms100ms内到位 / 时间常数2秒5–8%每20帧带1帧仅I帧和关键参考帧;等待0.5个往返,最多1次正常;丢包大于1%降10%
B 移动弱网5G/4G,往返40–80ms,丢包1–3%30ms40–60ms100ms内到位 / 时间常数3–5秒10–20%每10帧带1–2帧普通P帧也可;等待0.7个往返,最多1次,超时放弃主动降15–25%,保帧率优先
C 高抖动容灾跨省公网、拥挤Wi-Fi、手机热点,往返大于80ms,丢包3–5%50ms80–120ms立即扩容 / 收缩大于5秒或手动25–30%每10帧带3帧仅I帧;1次;超时放弃降30–50%,必要时锁30帧并提示

怎么用:先给用户分档(可以首次连接探测自动分,也可以让用户手动选“流畅优先/画质优先”),按档位设初始值,运行中根据实测抖动和丢包在档位内微调。FPS和格斗游戏默认往A靠,RPG和策略可以往C靠——同样是云游戏,品类不同,容忍度差一个档。

验收指标别只看平均延迟,建议盯三个:卡顿事件率(每分钟超过200ms的卡顿次数)、输入回声P95、糊块持续时长。这三个数比一个漂亮的平均延迟更能预测留存。

最后提醒一句:这张表是起点,不是终点。真上线以后,拿真实用户的网络分布回填门限,你会发现A档和B档的边界经常要挪,因为你的用户不是按运营商套餐分布的,是按“家里路由器摆在哪”分布的。

初级用户速览。如果你不是网络工程师,只想知道结论,记住五句话。一,平均延迟是广告,P95抖动和丢包才是体验。二,先修最后一公里——有线换Wi-Fi、2.4G换5G、路由器别塞柜子里,比任何协议优化都立竿见影。三,抖动缓冲是一笔延迟税,开得越大越稳也越黏,别默认拉满。四,FEC保随机小丢包,ARQ救关键帧,指望一个包打天下行不通。五,拿上面的映射表当验收标准,别拍脑袋说“能玩”。

进阶深入。如果你要动手调,顺序建议这样:先测网络分布(用户都用什么网、抖动和丢包的P95是多少),再定档,再调缓冲,再配FEC,最后接ARQ和码率自适应。指标定义要统一:帧间隔P95和P99、丢包突发长度、卡顿事件率、输入回声,四个都得有,缺一个你都会在复盘时吵架。

和本系列其他篇目的配套关系也理一下:第03篇测的是延迟均值与七个分量,这一篇测的是方差和丢失,两套数据合起来才是完整体检;第06篇的码率自适应会和缓冲抢延迟预算,要一起调;第10篇的主观评估用来验证你调出来的参数玩家买不买账;第11篇和第14篇讲传输协议,FEC和ARQ具体放在哪一层,那两篇是参考答案。

A/B测试别只切一个参数,缓冲、FEC、码率是一组,一起切,看留存、退出率、主观评分三个指标。单独切缓冲,你很难分清效果是缓冲带来的还是那几天网络波动带来的——这种误判我在项目里见过不止一次。

坑一:只看平均丢包率,忽略突发。FEC对随机丢包有效,对连续成串的丢包基本无效——你算不回来。真实网络里丢包经常是成串来的,测的时候一定要注入突发模式,别只测均匀随机。

坑二:缓冲开太大,把延迟问题藏起来。弱网下画面是稳了,玩家却觉得“这游戏怎么这么黏”,然后默默卸载。稳定不等于好玩,这句话值得贴在工位上。

坑三:FEC加太狠,和码率自适应打架。冗余带宽一涨,可用带宽一紧,自适应降码率,画面变糊,你以为在救体验,其实在制造新问题。第06篇讲过这个循环。

坑四:在有线环境测出“云游戏很行”,用户却在Wi-Fi上骂娘。测试环境和用户环境不是一回事,验收一定要覆盖弱网样本,而且样本要来自真实用户,不是实验室。

坑五:把帧保持当丢包修。有些卡顿是解码器参考帧缺失或者渲染队列堆积,不是网络丢包,修错地方白花钱。

还有个真争议:FEC该不该默认开?一派主张默认小冗余(比如5%),用一点带宽换稳定,用户感知不到;另一派主张按需开,网络好的用户不该为别人买单,而且冗余会影响码率自适应的判断。我的看法偏前者,但有个前提——冗余率要能动态退回去,别一直背着。这事没有标准答案,取决于你的用户网络分布和商业模式(按流量计费还是包月)。

抖动缓冲区到底开多大?看两个东西:你的P95抖动,和你的品类。经验上缓冲深度覆盖P95抖动再留一点余量,FPS和格斗往20到35ms压,RPG和策略可以放到60到120ms。别死记数字,先测再定,而且一定要做成可动态调的。

家里千兆宽带还是卡,怎么排查?先换有线对比,如果有线好了,问题在Wi-Fi:信道拥挤、2.4G干扰、路由器性能、摆放位置。再看后台有没有下载占满上行(云游戏对上行也敏感)。还卡就抓包看抖动和丢包,而不是看带宽。千兆是车道宽度,抖动是路上有多少车在别你。

为什么平均延迟很低,玩起来还是顿?因为平均值骗人。顿的那几下来自尾部:P95和P99抖动、突发丢包、帧保持、编码队列堆积,甚至垂直同步。把测量窗口拉长,看卡顿事件率和P99,你大概率能找到那几下。

用5G玩云游戏,丢包怎么办?5G的麻烦是抖动和切换,不是带宽。尽量在信号好的地方玩,别移动中玩;开FEC、降码率、锁帧率;如果平台支持,选离你近的节点。别指望5G能给你和有线一样的稳定性,那是两回事。

FEC和ARQ能都开吗?会不会打架?能,而且应该都开,但要分级和去重:关键帧双保险,普通帧只靠FEC;重传请求延迟发,给FEC留恢复时间;剩余缓冲不够一个往返时,直接关ARQ。打架往往不是因为都开,是因为没分级、没预算。

有个反直觉的观察:网络越好,抖动缓冲越该小;但产品越成熟,越该给用户一个“稳定性优先”的开关。因为你不是在优化一张网,你是在优化一群人的预期——硬核玩家宁愿偶尔卡一下也要跟手,休闲玩家宁愿黏一点也不要看到花屏。同一套参数服务不了两种人。

留个问题给你:如果有一天P95抖动真能做到10ms以内,抖动缓冲还需要吗?还是说,那时新的瓶颈会变成编码队列、渲染帧时间,或者别的什么我们现在还没认真看的东西?

抖动和丢包讲完了,下一篇聊画质——糊到什么程度算不能忍,那是另一套量化方法,也是另一群玩家的底线。

文章标签
云游戏Cloud Gaming视频编码H.264H.265AV1WebRTC低延迟传输ABR 自适应码率GPU 虚拟化DLSS 云游戏FSR 云游戏
更多专题全部专题
觉得有价值?点赞或收藏支持内容持续产出。
← 返回专题:云游戏技术专题