多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

AnyPS5:局域网游戏串流低延迟改造实践

AnyPS5:局域网游戏串流低延迟改造实践 晚上十点客厅电视被家里人切到了电影频道。我拿着手柄站在卧室门口盘算着是把主机搬去书房接那台老显示器还是干脆关机明天再玩。就在那个瞬间我决定不再折腾硬件的位置而是折腾网络。于是有了 AnyPS5 这个项目。AnyPS5 不是一个外设盒子也不是什么破解方案它是一整套围绕“在局域网内让主机画面出现在任何一块屏幕上”的改造实践。手机、平板、笔记本、客厅电视盒子只要人在家里任何一个角落点亮屏幕就能接着推进度。这篇文章会把项目背后的思路、网络调优参数、四类终端的适配过程和踩过的坑完整记录下来也会聊清楚为什么有些环节必须这么做。如果你正被“只有一台电视能玩主机游戏”这件事困扰或者对低延迟串流技术感兴趣这篇文章应该能帮你少走不少弯路。1. 为什么官方串流总让我觉得“差半口气”1.1 把延迟拆分来看等待时间到底花在哪了串流这件事本质上就是“快递”。主机把画面打包寄到你的屏幕你的按键输入再寄回主机。每一段路都有固定开销拆开看大概是这几个环节画面采集与编码主机把GPU输出收集起来用硬件编码器压成视频流网络传输数据包从主机到路由器再从路由器转发到终端解码与渲染终端芯片把视频流还原成画面交给屏幕显示控制回传手柄输入通过蓝牙或USB到达终端终端再回传主机我最初用官方串流App测试时局域网内显示的延迟经常在70到100ms之间。看起来不算夸张但玩动作游戏时按键反馈总有一种“雾里看花”的黏滞感。问题不是出在单一环节而是每个环节都留了太多冗余。各环节理论开销可以列个表看环节理论开销冗余来源画面采集与编码4-10ms固定码率导致缓冲堆积网络传输有线小于1ms路由器不识别游戏流网络传输5G Wi-Fi2-5ms信道拥挤触发重传解码与渲染3-10ms客户端缓冲策略保守手柄回传2-6ms蓝牙跳频、USB轮询这些加在一起大概是11到32ms也就是说“局域网内40ms以内”完全有理论空间。官方App跑到70到100ms说明它在缓冲和码率策略上偏保守优先保证“别断”而不是“更快”。后续所有优化就是把这些冗余一层层挖掉。1.2 官方客户端的两道隐蔽的墙第一道墙是码率与编码档位基本不可调。官方客户端在局域网内使用的码率档位相对固定画面剧烈变化时它会触发整体降码而不是优先保帧率。对动作游戏来说帧率比清晰度重要得多一旦画面复杂场景出现你看到的不是“变模糊一点”而是“手感立刻变肉”。第二道墙是缓冲策略固化。官方客户端为了防止任何可能的卡顿会主动把视频缓冲区拉大延迟自然被抬高。有个现象可以验证当画面出现大量动态变化时花屏和噪点变多同时延迟反而升高——这是因为缓冲区在不停重建。“画面能看”和“操作跟手”其实是两套标准而官方默认值明显更偏向前者。于是 AnyPS5 的思路就清晰了不碰主机系统不碰游戏文件只在“主机到屏幕之间的网络和终端接入”这一层做优化把串流当作水电煤一样的基础设施对待。目标只有一个——在局域网内把官方串流能力的延迟压得更低帧间隔压得更稳。1.3 项目定位不是应急功能是基础服务很多玩家把串流当成“偶尔躺在床上的应急方案”用一次嫌麻烦就不用了。我把位置换了一下既然串流链路能稳定到接近本地体验那它就应该成为日常生活的一部分。这也是 AnyPS5 这个名字的由来——不是说“任何PS5”而是说“PS5 应该出现在任何你愿意坐下来的地方”。2. 架构拆解从主机到屏幕中间到底放了什么2.1 一条主链路和“接入层”整个系统的链路是主机 → 家用路由器 → 接入层 → 各类终端接入层是我自己搭的一个小服务运行在一台软路由上也可以跑在长期开机的PC或开发板上。它做的事包括定期扫描局域网内的主机记录固定IP提供统一的设备发现与配置下发。简单说主机的串流服务入口被它接管了。具体布局可以这么理解主机通过网线接到路由器LAN口IP固定为局域网内的一个静态地址接入层服务监听局域网内主机上报的串流入口信息手机、平板、笔记本、电视盒子在接入层注册后就能按预设参数拿到对应的串流入口这套设计最初看起来有点多此一举——官方App也能扫到主机为什么还要多做一个发现层因为终端多了之后四台设备分别去连主机每次都要重输PIN、重设画质档位非常烦躁。统一接入层能保存每个终端的配置笔记本用高码率手机用中码率电视盒子锁定低延迟模式。这些东西集中管理省下的全是日常时间。2.2 为什么选择“路由器侧优化开源客户端”组合官方客户端适合应急稳定但保守。开源客户端则把很多参数暴露出来——码率、帧率、编码格式、解码缓冲大小、音频缓冲区——能在局域网这种可控环境里把延迟压得比较狠。不过光有客户端还不够。网络层不配合延迟依然会被路由器用默认策略拖后腿。真正让延迟降下来的关键是路由器能够识别主机的流量并优先转发。所以我用的是这套组合开源客户端负责“尽量快地编解码”路由器侧做优先级标记和队列调度接入层负责“让每个终端即开即用”这套组合不是唯一答案不想折腾路由器的话只调客户端缓冲参数也能有改善但效果会打折扣。我自己实测下来路由器侧优先级标记这个动作能带来大约10到20ms的稳定提升而且对画面清晰度没有任何损伤。2.3 AnyPS5 的三个使用原则Any Screen手机、平板、笔记本、电视盒子任何屏幕都能成为主机的显示器Any Place客厅沙发、卧室床头、书房桌面不用死等电视机Any Controller原装手柄、常见第三方手柄、键鼠映射都可以接入这三个原则帮了大忙。每次想做无用的“优化”时我都拿它们来衡量这个改动是不是减少了一个等待环节如果不是那它就不是 AnyPS5 该做的事。3. 网络层调优从80ms到28ms的实测过程3.1 先做减法有线回程和无线前置第一个测试对象是主机到路由器的连接方式。之前家里主机放在卧室通过无线网络接入客厅的路由器。我一度以为5G Wi-Fi足够应付但实测下来无线传输的数据包在高负载下会触发重传机制重传一发生帧间隔立刻跳动。用同一款开源客户端1080p 60fps固定档位对比数据如下链路方式平均延迟延迟抖动体感主机有线 终端有线24ms2-4ms接近本地主机有线 终端5G29ms5-8ms基本跟手主机无线 终端5G42ms12-20ms偶尔粘滞主机无线 终端2.4G80ms以上高抖动基本不能玩结论非常直接主机的网络入口必须优先插网线。如果主机和路由器之间的无线链路是瓶颈后面调QoS再勤快也没用。这步是地基。3.2 5GHz信道的“环境博弈”接下来处理终端一侧。手机和平板最常见的连接方式就是5G Wi-Fi。家用路由器默认的自动信道会把设备放到拥挤的公共信道上。如果邻居的路由器也都开自动信道你的终端会频繁遭遇竞争和重传。我的处理方式把5GHz主信道固定到36避开雷达信道和拥堵段关闭同频段的自动切换游戏终端强制锁定5G不让它飘到2.4G控制终端信号强度在-65dBm以上相当于终端离路由器不超过两个房间这个操作没有成本却非常有效。信道从自动改成固定36之后延迟抖动直接缩小了一半。体感上画面不会再有那种“一阵一阵”的顿挫感。3.3 QoS与MTU两个被忽视的参数QoS 是 AnyPS5 的重头戏。在路由器里把主机的MAC地址加入高优先级列表同时把终端设备的回传流量也标为“交互类”。之后就算家里有人看在线视频、下载大文件串流数据包依然能优先通行。这里有个关键点也是很多教程不讲清楚的QoS不是“打开就有效”。很多路由器的QoS只处理下行不处理上行。手柄输入回传是上行数据如果只给下行加优先级按键反馈照样卡。买路由器或刷固件时得确认上行和下行两个方向都能标记否则等于白设。MTU 也是一个坑。家庭宽带走运营商PPPoE拨号时默认MTU是1500但实际可用载荷通常在1460附近。如果客户端和服务端协商出来的数据包过大就会触发IP分片分片在路由器上会造成额外的重排延迟。我把路由器WAN口的MTU调到1400主机和终端也统一降到1400之后最直观的变化是花屏和帧撕裂明显减少。整套调整完成后数据变成了平均延迟28ms帧间隔抖动控制在6ms以内。在手机端和电视盒子上玩动作游戏终于能正常弹反和瞄准了。4. 四类终端适配手机、平板、笔记本、电视盒子4.1 手柄连接与配对顺序的坑串流终端的手柄连接是我踩坑最多的地方。先说常规顺序先蓝牙连手柄再打开串流客户端——结果手柄输入回传路径多了一条蓝牙链路延迟增加3到5ms。蓝牙稍微隔远一点或者中间放了USB 3.0外设产生电磁干扰延迟直接翻倍。推荐顺序反过来先打开串流客户端再连手柄。很多开源客户端在连接成功后会把手柄输入识别为USB模式传给主机绕过蓝牙链路。手机和平板如果支持优先用扩展接口接手柄而不是长时间挂蓝牙。另外有个很隐蔽的问题当主机本身就连着原装手柄并处于待机状态时新终端的手柄输入有时会被主机识别成“第二个手柄”。这时需要先回到主机的用户选择界面把旧手柄踢掉。这个问题在官方串流里同样存在属于协议设计不是设备故障。4.2 画质档位按屏幕尺寸选择码率不同屏幕对码率的感知差别很大。同样的6Mbps码率在手机上看着很清晰投到55英寸电视上全是糊边。我按终端形态整理了一套预设方案终端类型分辨率与帧率建议码率注意点手机5-7英寸1080p 60fps6-8Mbps优先保证帧率平板9-13英寸1080p 60fps10-15Mbps可以保留HDR笔记本与PC14-17英寸2K 60fps15-20Mbps有线连接更稳电视盒子与客厅大屏1080p 60fps20-30Mbps必须开游戏模式这套档位我调了很久。核心原则是码率可以多给帧率绝对不能掉。除非链路已经非常稳定否则不建议串流4K——编码和解码带来的延迟增量会抵消掉画质上的那点提升。4.3 电视盒子的隐藏延迟输入模式电视盒子接电视之后会被电视当作普通机顶盒输入。电视默认的“画质增强”处理包括运动补偿、降噪、插帧会给整条链路增加20到50ms的延迟体感就是按键后大约半秒画面才有反应。解决办法在电视上把对应HDMI输入口标记为“游戏模式”打开盒子自带的低延迟模式很多盒子的“性能模式”就是这个用途把输出帧率匹配到游戏的60Hz避免额外的帧率转换如果发现盒子画面卡在输入模式的叠加层跳不出去试试把盒子的分辨率锁定1080p而不是让它自动协商到4K再降下来。我的一位朋友 A 同学这么操作之后延迟直接少了十几毫秒。5. 稳定运行前我踩过的四个坑5.1 待机唤醒必须手动打开网络唤醒第一次跑通整套链路时主机进入待机后终端无论如何都唤不醒它。原因不复杂串流要求主机在系统设置里打开“从待机模式唤醒”而这个开关默认不开启。主机待机时网络接口依然供电但能不能被唤醒由系统设置决定不是路由器能解决的。把设置打开之后再从终端发起串流请求主机会自动点亮并进入会话。要注意完全关机状态下无法通过网络唤醒所以这个功能依赖“待机”而不是“关机”。5.2 音画不同步背后的缓冲区逻辑有一段时间画面和声音明显错位动作已经打出去了声效却迟了零点几秒才响。查了大量日志后定位到原因音频缓冲区和视频缓冲区是分开设置的。官方App默认用较大的音频缓冲防止爆音视频缓冲已经被我调低后两边不对称就产生了音画漂移。解决办法在开源客户端里把音频缓冲区也调低通常设置为64到96ms。同时把主机的音频输出格式设为线性PCM避免主机端做多余的格式转换。如果终端是电视盒子把音频模式设为直通避免盒子内部的采样率转换再增加一层延迟。5.3 断连后找不到主机固定IP与AP隔离串流过程中偶尔会出现断连重连时终端扫不到主机。排查之后发现路由器开启了AP隔离——这个功能让无线设备之间互相隔离官方App走特殊协议可以绕过去但开源客户端直接依赖局域网发现隔离一开就失效。更常见的情况是主机分配到动态IP路由器重启后IP变了终端还在接旧地址。把主机的DHCP预留改成固定IP这个现象彻底消失。建议每个折腾串流的人先把主机地址固定下来不要在IP问题上浪费时间。5.4 第三方手柄兼容模式优先第三方手柄的兼容性参差不齐。有些手柄支持切换兼容模式能在主机端被识别成原装手柄有的只有一个默认模式串流时按键功能错乱。我的建议是凡是有模式切换功能的手柄一律优先切到兼容模式再配对。如果协议不正常先别急着怀疑网络先用原装手柄验证一遍能排除一整类问题。6. 我建议的配置清单与下一步打算6.1 家庭局域网串流的最低配置和推荐配置项目最低配置推荐配置路由器支持5GHz带基础QoS可刷第三方固件支持上行和下行独立标记主机网络5G Wi-Fi连接网线直连路由器LAN口终端首选支持硬件解码的手机支持硬解的平板或PC接入层设备一台长期开机的PC低功耗软路由或开发板说实话配置提升的边际收益在后半段很低。有人为了串流专门买旗舰路由器结果发现瓶颈在主机和终端之间的墙体结构上。把网线布好比换多少钱的设备都实在。6.2 下一步想扩展的几个方向稳定版跑了一段时间后我把 AnyPS5 当成一套基础系统在看。接下来有三件事想做把串流入口接入家庭自动化平台检测到人在卧室时自动调低其他房间的音量让游戏音效更聚焦用同一套局域网扫描逻辑做存档备份提醒定期把主机的存档列表推送到手机给电视盒子做一键进入串流的快捷键省掉每次点开客户端、输PIN的重复操作这些扩展不是必须但说明一个事实当串流链路本身变好后围绕它的自动化玩法才有意义。链路都卡得一塌糊涂时自动化只会放大痛苦。最后分享一点个人体会串流这套东西方案比设备重要。我用的主力设备并不贵真正的分水岭在于愿不愿意把网线布好、把信道调好、把优先级标好。如果家里的网络底子一般买再多所谓的游戏加速设备也救不了客厅到卧室那道墙。先把布线搞定再谈参数方向一定不会错。
返回列表