vdi-cloud/docs/mouse-optimization-execution-20261103.md

59 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 鼠标进一步优化执行记录(2026-11-03)
这是用户要求“制定计划并按照计划干”后的本轮记录,与此前已部署的两个输入补丁分开。
## 实际进度
用户确认运维正在处理 GPU Code43。测试中 Windows 多次外部关机/启动;本轮未发出任何 VM/设备/宿主重启指令。已暂停 Windows 配置修改和串流测试,继续完成盒子端开发与文档,尚未达到最终性能验收。
| 阶段 | 状态 | 结果 |
| --- | --- | --- |
| 基线 | 完成初检 | GTX965M Code43 / libx264;VDD活动设备DISPLAY2、2K30Hz,枚举支持2K60Hz;盒子输出正常2K60 |
| 刷新率 | 部分完成,联调暂停 | 工具支持查询/枚举/临时应用/恢复;临时切换2K60并读回成功;完整动态对照待运维结束 |
| 输入调度 | 开发、编译、自动化测试完成 | 第三补丁及可关闭的诊断可用;当前独立渲染线程没有主线程render调用,未证明收益,默认未启用 |
| 独立光标 | 设计完成,尚未实现 | 必须改双方协议和捕获交接;不能把全局快捷键或叠加本地箭头当成独立光标功能 |
| 现场收尾 | 盒子完成;Windows待运维结束 | 测试串流已退出,默认客户端还原原哈希;显示守护正常;Windows测试窗口随关机退出,任务登记待可安全联调时清理 |
## 新增实现
- `terminal/moonlight/patches/0003-vdi-input-priority.patch`:帧前有限输入调度(`VDI_INPUT_PRIORITY=1`才启用)和汇总诊断(`VDI_INPUT_TIMING=1`才启用)。只让紧邻的本窗口真实鼠标/键盘事件优先,最多32条或2ms,不跨焦点、窗口、退出、其他帧或设备事件。
- `terminal/moonlight/tests/test_input_priority.cpp`、`tools/test-moonlight-latency.sh`:普通与AddressSanitizer测试覆盖新增边界;现有移动/按下/释放1000轮回归保持通过。ASAN现在也实际覆盖SDL/帧所有权测试,所有测试显式保留断言。
- `tools/set-vdi-display-mode.ps1`、`tools/run-mouse-display-probe.py`:只选择活动VDD,拒绝多VDD歧义;模式预检、备份、临时应用、读回和恢复。通过已登录用户会话运行并清理本次探测任务,不写注册表持久模式。
- `tools/bench-mouse-stream.sh`、`tools/inject-mouse-sweep.py`:独立标签日志,拒绝覆盖已有证据或现有用户串流;125Hz/20秒模拟移动和32次点击。仅可在Windows临时全屏测试窗口已运行时使用,不可对普通工作桌面盲目注入点击。
- `tools/input-latency-bench.ps1`:修正源定时器量化问题,使用绝对单调时钟帧序号及测试进程1ms定时精度,退出时释放。修正版尚未在Windows部署运行。
## 初测与限制
| 项目 | 2K30、VDD30 | 2K60请求、VDD60 |
| --- | --- | --- |
| 接收/渲染 FPS | 29.01 / 28.39 | 31.08 / 30.56 |
| 主机处理平均 | 39.9ms | 45.3ms |
| 解码/排队/呈现平均 | 11.90 / 0.33 / 1.81ms | 10.19 / 0.16 / 1.73ms |
| 网络延迟/抖动丢帧 | 4ms / 2.15% | 10ms / 1.68% |
| 新输入优先调度 | 未启用 | 未启用(诊断候选二进制) |
**这两段不能作为“2K60达标”或性能提升结论。** 旧WinForms测试窗口的16ms定时器被系统时间粒度量化,实际画面源约32FPS,网络也有波动。已修正本地测试源,需要重新对照。中断的baseline30/paced30不计入数据。
诊断会话trial60-no-priority派发年龄2601个样本,平均0.97ms、P95=1ms、最大1006ms;主线程render调用样本0。P95说明该会话大多数输入事件排队较短,不能忽略最大值,也不能据此宣称物理鼠标到屏幕只有1ms。约1秒异常可能涉及启动遗留事件,需要下一次带启动阶段分类的诊断核实,尚不能认定原因。基线会话Windows窗口确认收到32条交替点击,全部落在预期左右区域。
源代码核实PacerRender独立线程负责当前EGL呈现,因而新的“呈现前处理输入”调度对这条路径没有已证明的作用,保持关闭。当前鼠标画面仍需服务端捕获/编码后返回;下一步重点仍是修复GPU、验证足够的捕获/编码帧率和独立光标交接。
## 构建与回退
盒子目录:`/home/armbian/vdi-build/rkmpp-experiment/build/moonlight/app/`。
- 正常默认`moonlight`已恢复本轮前版本,SHA256 `35de7b1a4ade583823b23b5f2e012307f6d0a3848c8eb97bd6d4de9660afa00f`。
- 本轮候选`moonlight.input-priority-20261103`,SHA256 `ef0707ed2053f15ad6f62a33a79ac360237b27f307777c79b379b105fabfe3a2`;仅用显式`VDI_RKMPP_CLIENT`选择。正常wrapper未改用它。
- `moonlight.before-priority-20261103`为正常版本的额外备份。
- VDD60是临时模式,没有修改原登录设置2K30的脚本。VM关机后不以旧读回结果推断新启动状态;恢复联调首先Query,必要时Restore。备份位于`C:\ProgramData\VDI\mouse-optimization\display-before.json`。
- Windows基准任务没有开机/周期触发器。恢复联调后先执行`python tools/run-input-latency-bench.py stop`清理遗留登记,再启动修正后的测试源。
证据在`docs/evidence/mouse-optimization-20261103/`。没有重启盒子,没有修改GPU直通/ROM、Sunshine配置、Windows全局鼠标主题或其他虚拟机。
## 运维结束后的顺序
1. 清理临时基准任务,查询VDD;记录nvidia-smi、NVIDIA D3D11及当前Sunshine实际编码器,不能只看编码器探测日志。
2. 用修正源确认足够的源帧率,再做2K30/60配对和输入/拖窗验收。未通过则保持当前稳定参数。
3. 显式选择候选客户端并开启诊断,核实约1秒最大派发年龄是否属于初始化事件;当前EGL路径不默认启用帧前输入优先。
4. 按独立光标设计准备固定版本Sunshine构建,然后实现双方协议、帧边界交接、形状/显隐及故障回退,再进行单光标验收。此项尚未完成。