63 lines
6.6 KiB
Markdown
63 lines
6.6 KiB
Markdown
# 鼠标进一步优化执行记录(2026-11-03)
|
||
|
||
这是用户要求“制定计划并按照计划干”后的本轮记录,与此前已部署的两个输入补丁分开。
|
||
|
||
后续更新:用户确认运维修复后已恢复联调;当前已落地VDD60Hz/客户端45FPS,约43~44FPS渲染,详见`docs/2k60-validation-20261103.md`。下文保留运维期间的历史记录,不再代表当前GPU故障或联调暂停状态。
|
||
|
||
最新补充:用户要求尝试独立光标,已完成受控X11本地指针原型,四种真实Windows静态形状/热点、隐藏、暂停客户端时独立移动、32/32区域点击和辅助租约超时清理均通过。没有实现自动形状同步或正式双方交接协议;测试已收尾并恢复单个Windows远程白色光标,2K45及正常二进制保留。详见`docs/independent-cursor-feasibility-20261103.md`,勿将下文历史“未实现”理解为本地原型未做,也勿将原型误报为产品已部署。
|
||
|
||
## 实际进度
|
||
|
||
用户确认运维正在处理 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构建,然后实现双方协议、帧边界交接、形状/显隐及故障回退,再进行单光标验收。此项尚未完成。
|