
04-真实公网端到端实测20fps与1.16Mbps与0丢帧前面把架构、加密、采集、注入、打包、侦察都讲完了。这一篇是验收——把整套东西架到真实的公网上跑一轮真实的远程桌面然后如实报告每一个数字包括不好看的那些。工程上最宝贵的不是跑通了而是跑通之后敢不敢把真实数据摊开给人看。这篇就干这件事。一、这次实测为什么最关键很多项目喜欢拿本机回环“局域网跑个 demo 就说可用”。本项目刻意没这么做——这次实测是真实配置三端用的就是你要拿去部署的那份配置真实屏幕被控端采集的是一台真实 Windows 的真实桌面2560×1408 原生分辨率有真实内容、有像素差异真实 VPS中继跑在一台境外 VPS 上监听 443、带 TLS真实公网往返两端各自经公网连到 VPS再由中继配对不是本机对打。也就是说它验证的是你将来每天真正会用的那条链路而不是一个看起来能跑的玩具环境。这是本项目所有实测里最关键的一次。二、完整指标表环境真实境外 VPS 中继 443/TLS Agent 用 dxcam 采集 2560×1408 原生 两端经公网连到 VPS 配对。指标实测值两端配对✅ 证书指纹与中继打印的完全一致帧率~20 fps达到max_fps上限上行码率1.159 Mbps60 秒传输量8.29 MB / 1097 帧丢弃帧0解码耗时~5 ms画布2560×1408像素标准差 22.8真实内容基线 RTT121 msRTT 中位 / 最大838 ms / 2135 ms先解读几个好看的数字~20 fps 达上限说明采集编码传输解码这条链路在真实公网下能稳定喂满我们设的帧率上限没有明显的吞吐瓶颈1.159 Mbps 上行办公场景带宽极低对比可用上行 19 MbpsPhase 0a 实测远不是问题0 丢帧整轮 60 秒一帧都没丢画面不会残缺解码 ~5 ms控制端把收到的帧拼回画面的开销很小几乎不拖后腿像素标准差 22.8画布上确实是有内容的真实画面不是一片纯色纯色标准差会接近 0证明传的是真东西。但表里有两个数字乍看不漂亮RTT 中位 838 ms、最大 2135 ms相比 121 ms 的基线明显偏高。下面如实说明。三、两个必须如实说明的现象做工程最忌讳只报好看的。下面这两个现象项目源码和文档里是原样写出来的我也照实讲。现象一偶发丢包会造成 0.5~2 秒尖峰。链路上有偶发丢包表现为 TCP 重传超时。实测抓到的重传超时接近指数退避的数值1062 ms、1109 ms、2081 ms。基础延迟其实很健康50~130 ms但约一半的采样点会撞上这种尖峰于是 RTT 中位被拉到了 838 ms。而且那次测量放大了它因为当时 Agent 与 Viewer 都跑在同一台机器上视频路径是本机 → VPS → 本机两次穿过同一条有丢包的链路。真实部署是公司 → VPS和VPS → 家里两条不同的链路视频只穿过公司那条一次。所以真实部署的体验会好于表里的数字——这一句很重要它既不是粉饰也不是夸大而是诚实标注测量方式本身放大了问题。现象二周期性关键帧占了一半流量。60 秒里31 个关键帧 × 约 137 KB ≈ 4.25 MB占了总量 8.29 MB 的51%。换句话说办公场景画面大部分时间是静止的但每 2 秒补一个整屏关键帧反而成了流量主体。但不建议改。原因1.16 Mbps 对比 19 Mbps 的可用上行根本不是瓶颈而关键帧是丢包后的兜底——一旦某一帧损坏或丢失靠关键帧能在约 2 秒内把整屏纠正回来。如果为了省这点流量去拉长关键帧间隔丢包后的恢复就会变慢体验反而更差。2 秒的恢复速度比省这几 MB 流量更值钱。这一条很能体现工程取舍的思维不是流量占比高就一定要压而是先问压了之后代价是什么。当代价恢复变慢比收益省点带宽更贵时就老老实实留着。四、整轮 0 丢帧的原因既然有尖峰、有重传超时为什么还能做到整轮 0 丢帧这背后是两套缓冲在兜底写缓冲websockets 默认有 32 KB 的写缓冲发送队列项目自己还有一个 8 帧的发送队列。而我们的帧很小——平均只有 7.5 KB。于是 32 KB 写缓冲加上 8 帧队列约 60 KB 容量足以吸收偶发的尖峰。网络一恢复积压的帧立刻发出去不会把延迟越积越多。这里有个关键设计思想宁可掉帧也不累积延迟。带宽不足时发送队列满会丢最旧的帧、保留最新的画面状态并且把被丢帧涉及的变化块记回待补发集合在下一帧重新发送画面能自愈不需要发整屏关键帧去雪上加霜。所以尖峰来了最多是短暂卡一下网络恢复后自动追上延迟不滚雪球。这正是0 丢帧 体验可控同时成立的原因。五、带宽三场景表与办公场景带宽极低的结论单看整轮平均值会掩盖使用场景的差异。项目源码里把带宽按真实办公动作拆成三档场景更新包中位20fps 带宽静止 / 打字变化块约 0.3%3.3 KB0.54 Mbps✅打字密集段P9031.9 KB5.23 Mbps全屏刷新滚动长网页整帧 136.7 KB约 11.2 Mbps10 fps 时结论非常清晰静止和打字时带宽只有约 0.5 Mbps几乎可以忽略。办公场景绝大部分时间画面就是静止或只动几个字这正是远程办公的主旋律密集打字会到 5 Mbps 量级但也只是瞬时高峰只有全屏刷新比如猛滚一个长网页才会吃到 11 Mbps而且这种情况本身就少。所以一句话定调办公场景带宽极低。这也反过来修订了早期方案——原本按VPS 带宽 3~5 Mbps设计的激进压缩降分辨率、压质量被放宽了target_width默认改成 0原生分辨率文字最清晰因为实测证明办公场景带宽完全够没必要为了省带宽牺牲清晰度。六、实测前到底准备了什么真实公网实测听起来吓人其实前置准备很普通三件事到位就能跑两端用同一份真实配置。被控端config.toml填好 VPS 的relay公网 IP、room、relay_token、password控制端Viewer填同样一套。不是测试专用的假配置就是你要拿去日常部署的那份。证书指纹先核对。中继在 VPS 上首次启动会用 openssl 现场生成自签证书并打印一串 SHA256 指纹。实测时两端都把自己算出的指纹和中继打印的对比——完全一致才允许配对成功。这一步是防冒名中继的信任前提也是实测能成立的底线你确认连的就是你自己的中继而不是被 DNS 劫持到别处。被控端采真实桌面、两端走真实公网。被控端用 dxcam 采集 2560×1408 原生分辨率桌面上是有真实内容、有像素差异的真实画面控制端在家里被控端在公司各自经公网连到 VPS 再由中继配对。没有本机对打局域网直连这种取巧。准备就这三步没有任何特殊优化、没有为跑分调参。它验证的就是你将来每天会用的那条链路。七、和本机性能验证Phase 0b对比看光看这一张公网报表新手容易问我本机明明跑很快公网是不是工具不行把 Phase 0b 的本机数字和这次公网实测放一起答案很清楚指标Phase 0b本机真实公网实测采集单帧29.7 ms34 fps 上限稳定喂满 20 fps无吞吐瓶颈办公场景带宽0.54 Mbps中位0.54 Mbps静止/打字完全吻合解码耗时—~5 ms基线延迟本机近乎 0121 ms延迟尖峰无中位 838 ms / 最大 2135 ms丢帧—0怎么读这张对比带宽在两端吻合都是 0.54 Mbps说明 Phase 0b 定的压缩参数在真实环境里依旧成立不是本机凑巧。参数选对了。采集/解码无瓶颈本机测出 34 fps 上限公网只用到 20 fps余量充足公网没把采集–编码拖慢瓶颈不在这一环。延迟差异来自公网本身本机近乎 0、公网基线 121 ms、尖峰到 2 秒——这全是跨境公网和偶发丢包带来的不是你的代码慢。换句话说本机快、公网卡是常态卡在网不在码。0 丢帧在公网下依旧成立缓冲设计在真实环境里扛住了尖峰印证了第 4 节的结论。这张表最大的价值是帮你建立正确预期本机快是正常的公网有尖峰也是正常的工具负责把码这半边做到极致网那半边得靠你选个好 VPS、好线路。八、把如实报告当成一种工程态度这篇最难写、也最想让你记住的不是那几个漂亮数字而是敢不敢把不好看的也写进去RTT 中位 838 ms、最大 2135 ms照报关键帧占 51% 流量照报而且主动说明同机测量放大了尖峰不让读者误以为真实部署就这么卡。为什么这么做因为被粉饰的数据没有指导意义。如果你只看~20 fps、1.16 Mbps、0 丢帧就以为丝般顺滑等你真在跨境公网上遇到 0.5~2 秒的偶发尖峰会以为是自己部署错了。提前把尖峰、把它的成因、把真实部署会好一些都说清楚读者才能建立正确预期、知道哪些卡顿是正常的、哪些才是真出问题了。工程态度就这一句话如实报告数据包括不好看的数据。漂亮的数字让人心动诚实的边界让人能用好——后者才是真干货。最后补一句提醒上面这些数字来自一次特定的跨境 VPS 特定线路你的环境不会完全一样。VPS 选在哪、线路质量如何、被控端是不是原生分辨率都会让帧率、码率、延迟往上或往下浮动。能直接搬走的不是那几个具体数而是这套方法——按真实配置、真实屏幕、真实 VPS、真实公网去测再把带宽按场景拆开看最后把不好看的也摊开。你照着自己跑出来的报表读比抄我的数字有用。小结真实公网端到端实测给出的结论是在原生分辨率、真实屏幕、真实 VPS、真实跨境链路上能稳定跑满 20 fps、上行约 1.16 Mbps、整轮 0 丢帧、解码约 5 ms办公场景带宽低到 0.5 Mbps。同时它也有偶发丢包尖峰、有关键帧占半流量的不完美。这些不完美被如实地记录、分析、并给出为何不修的理由——这比一份全是绿勾的报表更值得你信任。把这套实测当成模板你换台 VPS、换个场景重跑一遍得到的就是属于你自己的、同样诚实的那份数字。最后补一句实践建议实测报表最好连测的时候在干什么一起记下来。同样一条链路你盯着桌面不动和你在滚动长网页带宽能差二十倍只写一个平均带宽的数字等于什么都没说。所以报告里要分场景取样、给中位数和 P90而不是只给一个平均值——平均值会把大部分时间很省和偶尔爆一下这两件完全不同的事糊成一团而后者恰恰是你需要提前准备容量余量的地方。