Files
ESP32S3_vt/PERFORMANCE.md
T
sloray cc6b82d7ec
构建客户端 / 检查(类型 + 单元测试) (push) Canceled after 0s
构建客户端 / Linux x64(deb + AppImage) (push) Canceled after 0s
构建客户端 / Windows x64(NSIS 安装包) (push) Canceled after 0s
构建客户端 / macOS 通用(.app + .dmg) (push) Canceled after 0s
feat: 链路控制、延迟校准与长测工具,补全文档
- 固件:新增 link_control / stream_control,覆盖运行中 Wi-Fi 断线恢复、取帧节拍、
  温控与质量/帧率减载;UDP 发送增加有界重试预算与帧期限,PSRAM JPEG 直发减少拷贝。
- 协议:重组器严格校验分片布局,统计未收齐、超时与完全缺失的帧,处理帧号回绕与设备重启。
- 桌面端:视频改 latest-value 通道并前置帧时间标记,拒绝积压和慢解码的过期画面;新增
  延迟标记页与 --latency-report 校准,完善录制、服务端与退出流程。
- 文档与脚本:新增硬件、开发、延迟、功耗、实时性、稳定性文档和改动记录,重写根 README;
  新增构建、性能、延迟与串口长测脚本,以及长测客户端脚本。
- 构建:固定 esp-1.97.0.0 工具链,分区表随构建复制,更新 sdkconfig 与忽略规则。
2026-10-19 00:19:07 +08:00

5.7 KiB
Raw Blame History

图传性能排查与验证(2026-10-18)

本文保留早期短时对照;当前交付已回退到 15 dBm,功率、距离与发送拥塞分析见 POWER.md,阻塞处理见 REALTIME.md。此前约 30 fps 与回显延迟数据见 LATENCY.md,更早验证见 STABILITY.md。下列数字对应当时的传感器时序和网络状态。

环境与结论

测试使用当前 ESP32-S3-N16R8 / OV5640,VGA 640×480、8 MB PSRAM、CPU 240 MHz、ESP-IDF v5.5.5。板端连接 2.4 GHz Wi-Fi,实际协商 HT20 / CCMP,主要有效窗口的信号约 −18~−32 dBm;Windows 通过同一路由器通信,Mihomo TUN 始终保持启用。单客户端对照使用 1 MiB 接收缓冲,每 800 ms 单播续订。

传感器在 CPU0 和 CPU1 均可输出约 22.2 fps。低帧率期间持续出现 sendto 的 ENOMEM(errno 12),完整帧提交率低于采集率,客户端收到不完整分片。普通系统内存仍有约 100 KiB 以上可用,证据指向无线发送拥塞与驱动缓冲回压。核绑定和单独扩大 Windows 缓冲均未解决主要瓶颈。

降低最大发射功率、使用视频队列,并降低单帧大小后有所改善。功率切换对照中,20 dBm 的窗口明显恶化,10 dBm 的两次窗口约 12 fps;14 dBm 的结果仍有波动。仅凭这些数据无法确定供电、天线、射频或 AP 的具体物理原因。

接收端对照

配置 时长 完整帧 窗口 fps 帧损失 完整帧间隔 P95 分片组装 P95
问题复测:20 dBm / 普通队列 / quality 12 30 s 165 5.49 74.69% 672.0 ms 109.0 ms
14 dBm / 普通队列 / quality 12 30 s 477 15.88 27.84% 242.2 ms 145.4 ms
14 dBm / 视频队列 / quality 12 60 s 1091 18.18 17.41% 194.4 ms 103.2 ms
该阶段选择:14 dBm / 视频队列 / quality 18 60 s 1177 19.62 11.30% 192.8 ms 94.2 ms

表中 fps = 完整帧数 / 整个测量时长。帧损失包括被替换的不完整帧、超时及帧号缺口;末尾仍在接收的帧不计损失。丢帧率与旧客户端的口径不同,旧版会低估实际丢帧。

无线链路有明显时变,早期其它窗口也出现过约 5~15 fps,表格不是长期保证或所有板卡的通用最优参数。前两行使用 CPU0,后两行使用 CPU1;核绑定对照未消除发送拥塞,最终保留显式 CPU1 配置。关闭 AMPDU 的试验几乎无法得到完整帧,已撤回;忙等重试也已撤回。另一次 40 ms 重试预算试验期间,有新客户端加入导致两个订阅者,且信号和画面复杂度变化;该轮约 12.6 fps,不能用于证明重试预算的单项影响,未作为最终配置依据。

最终参数与改动

  • 该测试阶段本机 .env 选择 CAM_QUALITY=18、WIFI_TX_POWER_DBM=14。分辨率保持 VGA;quality 数字增大表示压缩更强,细节会有所损失。仓库默认 quality 仍为 12,未设置发射功率时保留 SDK 默认上限;当前功率选择见 POWER.md。
  • 视频 socket 设置 IP_TOS=128,使用 AC_VI,并保留 AMPDU;64 个动态 TX 缓冲、TX BA window 32、FreeRTOS 1000 Hz。JPEG 在 PSRAM 中原地读取,仅复用一个数据报缓冲;临时发送失败让出调度重试,等待预算为每帧 25 ms。
  • 客户端按发现的设备 IP 定向续订,接收缓冲请求 1 MiB。随机会话 ID 让同一会话的端口变化更新目标地址;旧固定 ID 保留按地址区分。实测迁移后旧端口无新视频,新端口继续接收;两个旧版订阅仍各自收到数据。
  • 接收器拒绝迟到旧帧、重复完成帧和矛盾分片,处理帧号回绕、设备重启及超时。视频 WebSocket 只保留各路最新帧;前端每路至多一次解码与一张最新待解码帧,避免持续积压。

Windows 实际客户端验证

使用已构建的 release EXE 和独立裁判端测试配置,非演示模式。原用户配置、密码和绑定保留。

约 30 秒窗口中,后端完整帧增量 624、丢帧增量 38,窗口帧损失约 5.74%。界面连接存在,独立观察连接收到 619 张完整 JPEG,通道帧率 20.62 fps,帧间隔 P95 为 103.0 ms,无损坏 JPEG。

这项验证覆盖真实板卡、UDP 接收与重组、GUI 的 WebSocket 连接及二进制视频通道。另有 20 项协议测试、83 项客户端核心测试、9 项后端视频通道测试、5 项前端解码队列测试,以及 Windows 类型检查和生产打包通过。未将整个后端测试集或录制功能记为已验证。

**时间边界:**组装耗时是首末分片到达的差值,帧间隔是相邻完整帧到达的差值,均不是摄像头到屏幕的端到端延迟。未做两端时钟同步或实际屏幕的光学延迟测量,也未自动验证 WebView 最终绘制像素。

复测与原始记录

先退出其它图传接收进程,避免增加订阅负载:

python scripts/perf_probe.py <板卡IP> --seconds 60 --json perf.json --save-frame frame.jpg

本机原始 JSON、抽帧和串口日志在 target/camera-diagnostics/,随构建缓存忽略;主要文件为 fps-core0-raw.json、fps-tx14-raw.json、fps-quality12-raw.json、fps-final-raw.json、fps-final-client-result.json、session-migration.json。固件与 Windows 制品的 BUILD-INFO.json 记录最终测量及验证范围,ZIP 不包含用户运行配置。

设计依据:ESP-IDF 5.5.5 的 UDP 发送回压说明、Wi-Fi QoS 的 IP precedence / AC_VI 映射。这些文档说明机制,性能数字来自上述本机测量。