修复:消除 QProcess 重载歧义并归档串流故障验证

变更详情:QProcess::finished 重载消歧;文档:串流失败根因(双 IP ARP 混乱)与延迟 A/B 结论

- moonlight_session.cpp:QOverload 显式指定 finished 重载,修复 ARM64 编译
- moonlight.conf:vsync/frame-pacing 默认改回开启(A/B 实测关闭无改善)
- docs:补充 10-29 登录流程验收、重启验收、Monitor 恢复、双 IP 根因与 A/B 数据
- tools:新增 deploy_kiosk.sh 一键部署脚本与语法自检
This commit is contained in:
songyiming committed 2026-10-29 11:58:32 +08:00
1 parent 61127fb714
commit ee6f449bf1
7 files changed
+381 -46

No files matched your search

+69 -33
View File
@@ -276,63 +276,99 @@ D:\DAIMA\vdi-cloud\docs\freerdp3-embedding-notes.md
注意:此前对“X11 无 glamor 硬件合成”的判断不准确,Xorg 日志实际显示 `glamor X acceleration enabled on Mali450`;后续不要继续引用这个错误结论。正确表述是:当前路径仍未达到目标流畅度,具体瓶颈需要后续基准测试确认。
### 6.6 Moonlight 云桌面开机直达(2026-10-28)
RDP/Moonlight 实测对比见 `docs/rdp-vs-moonlight-comparison-20261028.md`,
落地记录见 `docs/moonlight-kiosk-20261028.md`。
盒子当前开机默认走 Moonlight 直连云桌面,链路:
```text
~/.config/autostart/vdi-moonlight.desktop
-> vdi-kiosk-monitor --heartbeat-file /tmp/vdi-moonlight.heartbeat --max-restart 200
-- /home/armbian/vdi-terminal/bin/vdi-moonlight
-> moonlight-qt stream 192.168.1.70 Desktop (fullscreen, 1920x1080, H.264, 软解)
```
仓库新增:`terminal/kiosk-shell/scripts/vdi-moonlight`、`etc/moonlight.conf`、
`vdi-moonlight.desktop`;`src/monitor.cpp` 改为按进程组结束整棵进程树。
实测:满屏云桌面 1:1 无缩放;杀客户端 5 秒内重连;杀启动器 3 秒内被看门狗拉起;
性能叠图 1080p60 实际 21.59 FPS、网络丢包 0%、延迟 3 ms、解码 15.04 ms、抖动丢帧 13.64%。
关键坑位(后续维护必须知道):
1. Windows 防火墙屏蔽 ICMP,盒子 ping 不到云桌面主机,但 TCP/UDP 正常;
可达性判断必须用 TCP 探测,ping 会误判;
2. `moonlight-qt` 的应用 id 随服务端重装/升级失效,旧 id 会报“找不到应用程序 <id>”;
命令行要用应用名 `Desktop`;
3. RK3528 上 `--video-decoder auto` 会选到不可用的 `h264_v4l2m2m`,
必须显式 `--video-decoder software`;
4. RDP 路径的自启项已禁用但保留,可随时切回。
## 7. 当前未完成/未验证
1. 当前工作区最后一次编译 Monitor 的命令被取消,Monitor 代码尚未确认编译通过;
2. Monitor 的主进程心跳机制尚未做真实“崩溃/假死/自动重启”测试;
3. kiosk-shell 开机自启尚未配置;
4. 网络状态显示修复(此前显示错误的 `600`)尚未确认最新二进制效果;
5. 当前实现仍使用 X11 POC,正式方案要求 Weston/Wayland;
6. 当前 RDP 会话使用 CPU GDI -> Qt 复制,尚未接 GStreamer/mppvideodec/VPU;
7. `mppvideodec` 来源和可用性未确认;
8. 终端注册、MQTT 心跳、配置下发、日志上报、OTA、USB 尚未接后端 API;
9. 前端/后端管理平台尚未接入;
10. GPU/P100 直通与 CUDA/CAD/3D 性能尚未完成;
11. Moonlight/Sunshine 方向只是项目经理新增的周一调研项,未安装、未验证、未纳入代码定版。
1. 服务端 GPU 直通未做:宿主机 `starhe` 有 GTX 965M(`0000:01:00.0`,IOMMU Group 2 独占),
主机同时有 Intel 核显 `0000:00:02.0` 可继续驱动本机显示,具备直通条件;
直通后 Sunshine 才能用 NVENC 硬编码,把 1080p 帧率从 ~21.6 FPS 提到 60 FPS;
2. RK3528 VPU 硬解不可用:`h264_v4l2m2m` / `hevc_v4l2m2m` / `hevc_v4l2request` 均报
`Could not find a valid device`,当前只能用软件解码,4K 目标必须先解决;
3. 2K 分辨率链路未验证:盒子屏幕现为 1920x1080@60Hz,Sunshine 侧虚拟显示器也是 1920x1080@60Hz;
4. 当前实现仍使用 X11 POC,正式方案要求 Weston/Wayland;
5. 当前 RDP 会话使用 CPU GDI -> Qt 复制,尚未接 GStreamer/mppvideodec/VPU;
6. `mppvideodec` 来源和可用性未确认;
7. 终端注册、MQTT 心跳、配置下发、日志上报、OTA、USB 尚未接后端 API;
8. 前端/后端管理平台尚未接入;Moonlight 路径目前读本地静态配置文件;
9. 终端音频出音未现场确认(`--audio-on-host` 已开);
10. 协议最终选型未定版:实测已证明 Moonlight 画面质量与 CPU 代价优于 RDP,
但“办公用 RDP、GPU/CAD/3D 用 Moonlight”的双协议结论仍需产品方案确认。
## 8. 下一步建议(按优先级)
### A. 收尾当前终端 POC
### A. 服务端 GPU 直通(当前最高价值项)
1. 编译并验证 `vdi-kiosk-monitor`;
2. 给 kiosk-shell 与 Monitor 做真实崩溃/假死重启测试;
3. 配置当前开发盒子的用户级开机自启,开机直达登录页;
4. 修复并验证网络状态显示;
5. 保留当前能进入 Windows 10 的版本作为可回退基线。
### B. 按项目经理新增方向做 GPU 协议调研
周一先验证,不先改代码定版:
Sunshine 在 VM 内用 libx264 软件编码,4 核同时承担 1080p 捕获与编码,
是 21.6 FPS 与 13.64% 抖动丢帧的唯一原因;客户端侧链路完全健康。
```text
P100 是否成功 PCIe 直通到 Windows 10 VM
-> VM 内 nvidia-smi 是否正常
-> CUDA/3D 应用能否使用 GPU
-> Sunshine 是否能在 VM 内捕获/硬编码桌面
-> RK3528 上是否有可用 Moonlight ARM64 客户端
-> Moonlight 是否能调用 VPU 硬解
-> RDP 与 Moonlight 的 CAD/3D/视频延迟、帧率、CPU、温度、带宽对比
宿主机 starhe(Xeon E3-1200 v3 + Intel 核显 + GTX 965M)
-> 确认内核 IOMMU 已启用(PCI 设备已有独立 IOMMU group)
-> vfio-pci 绑定 0000:01:00.0,提取 vBIOS ROM
-> VM 100 增加 hostpci,Windows 内装 GeForce 驱动
-> nvidia-smi 正常后 Sunshine 切 NVENC 硬编码
-> 复测 1080p60 帧率、抖动丢帧、服务端 CPU
```
可能的最终协议策略(只能在实测后决定):
主机 root 密码已知(`yx66668888`),可用 `SSH_ASKPASS` 非交互登录。
### B. 收尾当前终端 POC
1. 保留当前 Moonlight 开机直达版本作为可回退基线(`docs/moonlight-kiosk-20261028.md`);
2. 确认开机自启在真实重启后生效(当前只验证了手动拉起与被守护重启);
3. 网络状态显示修复(此前显示错误的 `600`)尚未确认最新二进制效果;
4. RDP 路径代码保留但自启已禁用,按需切回。
### C. 协议策略与代码结构
实测结论已经支持双协议方向,但仍未定版:
```text
普通办公 -> RDP
GPU/CAD/3D -> Moonlight
```
但也可能仍然统一使用 RDP;由测试结论决定。
如果确认需要双协议,代码结构应演进为:
```text
DesktopSession 接口
├─ RdpSession # 保留当前 libfreerdp3
└─ MoonlightSession # 调研后再实现
└─ MoonlightSession # 当前是 shell 启动器 + moonlght-qt 子进程
SessionManager # 根据 API 下发 protocol 选择实现
```
不要在调研前擅自确定 Moonlight 端口、认证字段、库、嵌入方式或把 RDP 删除。
不要在定版前擅自确定 Moonlight 的嵌入方式、认证字段或删除 RDP 代码。
### C. 后续 API 对接