diff --git a/MEMORY.md b/MEMORY.md index 690ebef..966a082 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -2,6 +2,24 @@ 完整对话总结在:`D:\DAIMA\vdi-cloud\PROJECT_CONTEXT.md` +## 2026-11-03 午后鼠标进一步优化(最新) +- 用户要求制定计划并执行;随后明确运维正在修复GPU Code43。Windows多次被外部qmshutdown/qmstart, + 本轮已停止Windows配置/串流测试,不能与运维并发改VM;没有发出VM/宿主/显卡重启指令。 +- 新增0003-vdi-input-priority.patch:帧前连续输入最多32条/2ms,保留焦点/窗口/退出等边界; + VDI_INPUT_PRIORITY=1才启用;VDI_INPUT_TIMING=1才记录SDL派发年龄及主线程render调用统计。 + 已在盒子编译,普通/ASAN测试通过。实际EGL使用独立PacerRender线程,主线程render样本0,未证明新调度收益。 +- 默认客户端已恢复本轮前哈希35de7b1a4ade583823b23b5f2e012307f6d0a3848c8eb97bd6d4de9660afa00f; + 候选另存moonlight.input-priority-20261103,哈希ef0707ed2053f15ad6f62a33a79ac360237b27f307777c79b379b105fabfe3a2。 + 正常wrapper未改用候选,新调度未默认启用;没有添加本地/透明光标。 +- VDD30Hz已查明,临时2K60应用/读回成功;但旧WinForms基准源本身约32FPS,2K30/60初测不能证明性能提升。 + 本地基准脚本已修正定时器量化,待运维结束再部署;VDD模式未持久化,原登录2K30脚本没改。 +- 新增set-vdi-display-mode.ps1、run-mouse-display-probe.py、bench-mouse-stream.sh和移动注入工具。 + 现场测试串流已清理;Windows基准窗口随关机退出,VDIInputLatencyBench登记无自动触发器, + 运维结束后先用run-input-latency-bench.py stop清理,再Query VDD/必要时Restore,再做新版源配对测试。 +- 独立光标完成源码核实与交接设计,尚未实现;Sunshine全局toggle不足以可靠回退,需要双方协议/帧边界交接。 + 计划/实际结果见docs/mouse-optimization-plan-20261103.md、docs/mouse-optimization-execution-20261103.md; + 后续设计见docs/independent-cursor-design-20261103.md。不能宣传本轮达到2K60或鼠标到屏幕1ms。 + ## 2026-11-03 显示器关开修复(优先于下文旧状态) - 关屏再开后画面变矮:盒子回退1920x1440@75(4:3),Moonlight 16:9视频上下黑边; MATE monitors.xml仍存旧4:3布局,原启动脚本只设置一次2K。 diff --git a/docs/evidence/mouse-optimization-20261103/native-asan.txt b/docs/evidence/mouse-optimization-20261103/native-asan.txt new file mode 100644 index 0000000..c939f44 --- /dev/null +++ b/docs/evidence/mouse-optimization-20261103/native-asan.txt @@ -0,0 +1,6 @@ +PASS: SDL event boundaries, bounded motion work, latest decoded frame ownership +INFO: VDI input timing: SDL dispatch age only; prioritized=0 +INFO: VDI input dispatch age: samples=1 avg=0.00 p50=0.0 p95=0.0 max=0.0 ms (percentiles capped at 102.3ms) +INFO: VDI main-thread render call: samples=1 avg=0.00 p50=0.0 p95=0.0 max=0.0 ms (percentiles capped at 102.3ms) +PASS: input FIFO, focus/quit/reset/window barriers, disabled mode, device/window isolation, count/time bounds +PASS: 1000 queued move/press/move/release cycles preserve positions diff --git a/docs/evidence/mouse-optimization-20261103/native-regular.txt b/docs/evidence/mouse-optimization-20261103/native-regular.txt new file mode 100644 index 0000000..c939f44 --- /dev/null +++ b/docs/evidence/mouse-optimization-20261103/native-regular.txt @@ -0,0 +1,6 @@ +PASS: SDL event boundaries, bounded motion work, latest decoded frame ownership +INFO: VDI input timing: SDL dispatch age only; prioritized=0 +INFO: VDI input dispatch age: samples=1 avg=0.00 p50=0.0 p95=0.0 max=0.0 ms (percentiles capped at 102.3ms) +INFO: VDI main-thread render call: samples=1 avg=0.00 p50=0.0 p95=0.0 max=0.0 ms (percentiles capped at 102.3ms) +PASS: input FIFO, focus/quit/reset/window barriers, disabled mode, device/window isolation, count/time bounds +PASS: 1000 queued move/press/move/release cycles preserve positions diff --git a/docs/mouse-optimization-execution-20261103.md b/docs/mouse-optimization-execution-20261103.md new file mode 100644 index 0000000..3332d25 --- /dev/null +++ b/docs/mouse-optimization-execution-20261103.md @@ -0,0 +1,58 @@ +# 鼠标进一步优化执行记录(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构建,然后实现双方协议、帧边界交接、形状/显隐及故障回退,再进行单光标验收。此项尚未完成。 diff --git a/docs/mouse-optimization-plan-20261103.md b/docs/mouse-optimization-plan-20261103.md index 4e05d11..fc0c522 100644 --- a/docs/mouse-optimization-plan-20261103.md +++ b/docs/mouse-optimization-plan-20261103.md @@ -26,8 +26,14 @@ 本轮不重启宿主、不刷 ROM、不动 VM101/102。Code 43 仍需按现有运维方案排查,修复后再验收实际 NVIDIA D3D11 和 NVENC;不能只设置 encoder=nvenc 就认定修复。 -## 执行结果 +## 前序优化结果 代码修改、自动化测试和现场配对串流对照已完成,结果见 `docs/input-rendering-optimization-20261103.md`。当前状态为:点击排序和客户端排队已改善, 仍需用户对真实拖窗、右键、快速双击进行体验验收;严格的输入到显示延迟仍需高速摄像或外部触发测量。 + +## 本轮进一步优化进度 + +用户确认运维正在处理 GPU Code43,已暂停 Windows 配置修改和串流测试,避免同时操作。盒子端新增第三补丁已编译并通过普通/ASAN测试,但当前独立渲染线程没有主线程呈现调用,未证明新调度收益,因此默认客户端已恢复本轮前版本。60Hz对照尚未完成,独立光标只完成设计,尚未实现。 + +本轮逐项结果、初测数据限制、候选版本和恢复联调步骤见 `docs/mouse-optimization-execution-20261103.md`。独立光标协议和单光标交接要求见 `docs/independent-cursor-design-20261103.md`。