diff --git a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md index deb42545..2a4099d9 100644 --- a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md +++ b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md @@ -1,6 +1,6 @@ # 当前阶段:P12 — server 自己开窗口上屏 -> **更新 2026-09-28**(含五臂传输性能对比,见 [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md))。这一页只有摘要;带裁定编号的明细、余项清单、证据位置在 [`notes/p12/README.md`](notes/p12/README.md)(计划与交接 [`PLAN-P12.md`](notes/p12/PLAN-P12.md))。P12 审查后的定向主机与真机复测已完成;验收 B 已于 2026-09-28 通过,验收 A 仍未打。上一阶段 P7 已于 2026-09-23 完成。 +> **更新 2026-09-28**(含五臂传输性能对比,见 [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md))。这一页只有摘要;带裁定编号的明细、余项清单、证据位置在 [`notes/p12/README.md`](notes/p12/README.md)(计划与交接 [`PLAN-P12.md`](notes/p12/PLAN-P12.md))。P12 审查后的定向主机与真机复测已完成;验收 A、B 都已通过(B 于 2026-09-28,A 于 2026-09-29)。上一阶段 P7 已于 2026-09-23 完成。 ## 目标 @@ -14,7 +14,7 @@ Android 上的 server 应用自己开一个全屏窗口,把收到的渲染流 | 代码审查发现的 10 个问题 | ✅ 已修 | | 主机门与单进程构建二进制不变(G1) | ✅ 原主机门 / G1 见 ID-P12-14/15;审查后 P12 定向 CTest **46/46**(`1fb18d9e`) | | 真机 7 项检查(两个后端上屏、排队与拒绝、窗口丢失、离屏不受影响……) | ✅ 审查后在 Redmi `2f7cbe2e` 复测通过(`1fb18d9e`);明细见 [`notes/p12/README.md`](notes/p12/README.md) | -| 验收 A:同一台手机上用 FCL 以两个后端进游戏,杀掉 server 后干净报"设备丢失" | ❌ 未做 | +| 验收 A:同一台手机上用 FCL 以两个后端进游戏,杀掉 server 后干净报"设备丢失" | ✅ 2026-09-29:Render Server 屏 + FCL(新增版本设置「游戏退到后台时不暂停」),双后端入世界,杀 server 后 33–54 ms 闩住 device-lost,FCL 不崩;[`notes/p12/FCL-ACCEPTANCE.md`](notes/p12/FCL-ACCEPTANCE.md)。Magma 竖屏窗口画面位置不对,未查 | | 验收 B:另一台电脑经 TCP 连手机进游戏,并记录链路数据 | ✅ 2026-09-28:WSL client 经 Wi-Fi 重放 rd12 世界内 trace,ssim 0.999883、251/251 帧;必测数见 [`notes/p12/CROSSHOST-ACCEPTANCE.md`](notes/p12/CROSSHOST-ACCEPTANCE.md)(client 是 trace 重放器,不是活的 Minecraft) | ## 性能现状(2026-09-28,Redmi 未定频交错 A/B) @@ -35,9 +35,8 @@ Android 上的 server 应用自己开一个全屏窗口,把收到的渲染流 ## 下一步 -1. 打验收 A(FCL 同机 spawn、双后端、杀 server 报 device-lost)。 -2. 收尾:写 `MG_Remote/CONTRACT-P12.md`、修门脚本误导的一行输出、收官审查。 -3. 零代码 knob A/B:`PRESENT_CREDIT=2`、shm 臂 server `SPIN_US` 降到 20–35、`SERVER_AFFINITY`;代码级:client doorbell 换 futex/eventfd、applier 自适应 spin、sendmsg 跨 Flush 合批。 -4. 之后按 [`ROADMAP.md`](ROADMAP.md):P8;P9 → P10 → P11。 +1. 收尾:写 `MG_Remote/CONTRACT-P12.md`、修门脚本误导的一行输出、收官审查。 +2. 零代码 knob A/B:`PRESENT_CREDIT=2`、shm 臂 server `SPIN_US` 降到 20–35、`SERVER_AFFINITY`;代码级:client doorbell 换 futex/eventfd、applier 自适应 spin、sendmsg 跨 Flush 合批。 +3. 之后按 [`ROADMAP.md`](ROADMAP.md):P8;P9 → P10 → P11。 **阻塞**:没有需要决策的事项。 diff --git a/docs/Disaggregated/MEASUREMENTS.md b/docs/Disaggregated/MEASUREMENTS.md index 828a707b..9a917959 100644 --- a/docs/Disaggregated/MEASUREMENTS.md +++ b/docs/Disaggregated/MEASUREMENTS.md @@ -47,5 +47,5 @@ | 13 | P3b/P4b | 纹理上传形状在四种拓扑下完全一致 | [`notes/p34b`](notes/p34b/README.md) | | 14 | P6.5 | 跨机 TCP 102/102;断线约 5 s 检测到 | [`notes/p65`](notes/p65/README.md) | | 15 | P7 | 真机画面 36/36;server 内存无界增长收住(主机 825 → 546 MiB) | [`notes/p7`](notes/p7/README.md) | -| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;纹理上传回包等待 1→0(主机机制门,真机墙钟待测);跨机 TCP 门 (b) 通过(rd12 ssim 0.999883、稳态 17–22 fps);FCL 门 (a) 仍待完成 | [`notes/p12`](notes/p12/README.md) | +| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;纹理上传回包等待 1→0(主机机制门,真机墙钟待测);跨机 TCP 门 (b) 通过(rd12 ssim 0.999883、稳态 17–22 fps);FCL 门 (a) 通过(Minecraft 上屏到 render server 窗口,杀 server 后 33–54 ms 闩住 device-lost) | [`notes/p12`](notes/p12/README.md) | | 17 | 五臂传输测量(2026-09-28,非阶段) | inproc/shm 重负载比 monolith 快 ~1/3;tcp localhost 瓶颈是 credit=1 + 唤醒税(SPIN_US=2000 → 2.9×);跨主机 hang 实为主机 xray TUN 代理造成;直连 Wi-Fi 稳态 rd12 17–22 fps、openra 105–133 fps | [`notes/perf-five-arm-20260928`](notes/perf-five-arm-20260928/README.md) | diff --git a/docs/Disaggregated/ROADMAP.md b/docs/Disaggregated/ROADMAP.md index fa3e5c15..8a3ad10d 100644 --- a/docs/Disaggregated/ROADMAP.md +++ b/docs/Disaggregated/ROADMAP.md @@ -1,6 +1,6 @@ # 路线图(索引) -> **2026-09-28**:P0 到 P7 已完成;当前阶段 **P12**(server 自己开窗口上屏)审查后主机定向测试和真机七项复测已通过,跨机 TCP 验收 B 已通过([记录](notes/p12/CROSSHOST-ACCEPTANCE.md)),FCL 同机验收 A 仍待完成。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。 +> **2026-09-28**:P0 到 P7 已完成;当前阶段 **P12**(server 自己开窗口上屏)审查后主机定向测试和真机七项复测已通过,两个收官验收都已通过(B [跨机 TCP](notes/p12/CROSSHOST-ACCEPTANCE.md)、A [FCL 同机](notes/p12/FCL-ACCEPTANCE.md)),剩契约文档与收官审查。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。 ## 目标 @@ -32,7 +32,7 @@ client(跑应用的一方)与 server(跑驱动的一方)可以在**不 | [Ph](notes/p7/README.md) | server 能安全地接受外来连接:令牌、限额、坏数据不致崩溃 | 必需项 ✅(随 P7) | | [P3b / P4b](notes/p34b/README.md) | GLES 后端的深化与收尾 | 大部分 ✅,余项并行 | | [P7](notes/p7/README.md) | Vulkan 后端完整迁移;真机画面检查 36/36 通过 | ✅ 09-23 | -| [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | **进行中**:审查后主机定向测试和真机七项复测通过;验收 B(跨机 TCP)✅ 09-28;验收 A(FCL + 杀 server)待完成 | +| [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | **进行中**:审查后主机定向测试和真机七项复测通过;验收 B(跨机 TCP)✅ 09-28;验收 A(FCL + 杀 server)✅ 09-29;剩契约文档与收官审查 | | [P8](notes/p8/README.md) | 把剩余的仿真路径挪到正确的一侧,补齐协议 | 待排 | | [P9](notes/p9/README.md) | 反向通道异步化(回读、写回不再同步等待) | 待排 | | [P10](notes/p10/README.md) | 同步对象、查询与帧节奏 | 待排 | diff --git a/docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md b/docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md new file mode 100644 index 00000000..c44fbfbe --- /dev/null +++ b/docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md @@ -0,0 +1,34 @@ +# P12 出口门 (a):FCL 里的 Minecraft 渲染到 render server 窗口,杀 server 干净 device-lost + +> 2026-09-29,Redmi `2f7cbe2e`(Adreno 830)。server = trace APK `26.09.27cbc53-trace` 的 **Render Server 屏**(勾 On-screen window, +> endpoint `tcp://127.0.0.1:40613`,Extra env `MOBILEGL_BACKEND_TYPE=…;MOBILEGL_PIPE_STATS=1`,点 Start server),窗口在 `:mglwin` 进程里。 +> client = FCL fordebug `com.tungsten.fcl.mgdebug.debug` 里的 Minecraft 26.3-rc-3,世界 `test`,`/sdcard/FCL/mg_transport.txt=spawn`, +> `mg_env.txt` 里 `MOBILEGL_IPC_CONTROL=tcp://127.0.0.1:40613`、`MOBILEGL_IPC_DATA=stream`、`MOBILEGL_IPC_SURFACE=server`、`MOBILEGL_BACKEND_TYPE`。 +> 驱动 [`tools/device_bench/disagg/fcl_accept.sh`](../../../../tools/device_bench/disagg/fcl_accept.sh),截图在 `.trace-work/perf-compare/fcl-accept/`。 + +## 结论 + +**门 (a) 通过,两个后端各一遍。** Minecraft 世界内的画面实时画在 render server 的窗口上;`kill -9` server 后 client 在毫秒级闩住 device-lost,FCL 进程不崩。 + +| 后端 | 入世界、画面上屏 | `kill -9` server | FCL 之后 | +|---|---|---|---| +| Espryt(DirectGLES) | ✅ 夜晚草原,天空 / 树 / 手 / 快捷栏都在;client `present` 计数持续增长 | `DEVICE LOST`(1 行),54 ms(修日志洪水前的构建,精确计时);修后构建同样闩锁 1 次 | 进程还在(修前构建观察 100 s;修后构建 ≥ 20 s),后续 present 被 DECLINED 空转 | +| Magma(DirectVulkan) | ✅ 画面上屏、`present` 持续增长 | `DEVICE LOST`(1 行),33 ms(修前构建,精确计时);修后构建同样闩锁 1 次 | 进程还在(修前 ≥ 30 s;修后 ≥ 10 s) | + +## 为了跑通做的三件事 + +1. **FCL 一退后台游戏就暂停。** FCL 的界面离开前台时,SDL 被切到 PAUSED,GLFW 的 focused / visible 也被撤销,渲染线程停住;而 server 窗口要在屏幕上就必须把 FCL 切到后台。 + FCL fork 里新增版本设置 **「游戏退到后台时不暂停」**(`keepRunningInBackground`,默认关,在版本设置的渲染组里):开启后强制用 TextureView 并让系统别销毁它的 SurfaceTexture + (SurfaceView 在界面不可见时会被销毁,游戏拿着失效窗口会报 `Failed to create backend OpenGL/Vulkan`),界面离开前台时不通知 SDL 暂停、不撤销 GLFW 焦点。 + 改动在 FCL 仓库(`JVMActivity`、`VersionSetting`、`VersionSettingAdapter`、`LauncherHelper`、三份 strings),**尚未提交**(父仓库处于合并冲突状态)。 +2. **FCL 的默认 spawn(游戏进程派生 server 子进程)走不通,只能接外部 render server。** FCL 把自己的窗口指针发给 server,server 按 P12 设计具名拒绝 + (`Fatal{UnmigratedSurface, "AndroidNativeWindow@P12"}`),client 随即 device-lost。 +3. **修了一个日志洪水。** device-lost 之后每个被 DECLINED 的 verb 都打一行 ERROR(`…woke on a dead doorbell; the server is gone`),FCL 里 48 秒 113,080 行、几千行/秒。 + `ClientSession.cpp` 两处改为闩锁已经说过之后不再重复;修后同样流程 `DEVICE LOST` 1 行、`dead doorbell` 0 行。 + +## 没验证 / 观察到的 + +- **Magma 在竖屏 server 窗口里画面位置不对**:游戏帧 2620×1280,窗口 1280×2620,画面只出现在窗口下部、被裁掉一部分;Espryt 那次是横屏窗口,没有这个现象。是几何 / 预旋转问题,还没查。 +- 没测性能、没测输入(server 窗口不转发触摸,游戏是自己进世界的,没有人操作)、没测长时间稳定性。 +- 时序有要求:FCL 的 JVMActivity 出现后要再等约 10 s 才把 server 窗口切到前台,否则游戏因 surface 未就绪卡住启动。 +- 每个后端只跑了一遍。 diff --git a/docs/Disaggregated/notes/p12/README.md b/docs/Disaggregated/notes/p12/README.md index abf8f344..29b5cf7c 100644 --- a/docs/Disaggregated/notes/p12/README.md +++ b/docs/Disaggregated/notes/p12/README.md @@ -8,7 +8,7 @@ - 形状:server APK 自建 `ANativeWindow`(`MobileGLDisplayActivity` 的 SurfaceView,进程内 TCP server,会话串行)把渲染流**上屏**;离屏路径保留、同一时刻一条活跃;client 以 `WindowKind::ServerOwned`(控制修订 3)**完全无头**接入,几何由 server 回传;失窗 → `Fatal{ServerWindowLost}` → 干净 device-lost。 - 进展:15 个 `(P12)` 提交 + 审查轮修复(10 个问题,ID-P12-5..11)已并入 `feat/disaggregated`;主机门绿(ID-P12-14)、G1 成立(ID-P12-15);审查后在 `1fb18d9e` 上完成 P12 定向 CTest 46/46 和 Redmi 真机七项复测。当前分支 `0fe01588` 后续提交只改了文档、文档检查范围和基准脚本说明文字,未改 P12 实现。 - **2026-09-25 追加(会话交接 §4/§5.1)**:**device-lost 的 DECLINED 回复容忍**与**纹理上传的等待粒度**已落地,各有自己的 red-once 门(前者就是进世界后 `Fatal{ProtocolCorruption, "Fence.reply"}` 那条崩溃;后者让单条纯上传的回包等待 1 → 0)。真机端到端(进世界不崩、那一帧墙钟)与 G1 本机复核仍待做,见 [`DEVICELOST-AND-UPLOAD-WAITS.md`](DEVICELOST-AND-UPLOAD-WAITS.md)。 -- 出口门 (b) 已于 2026-09-28 通过([`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md))。未完成:出口门 (a) FCL 同机 spawn + 杀 server 的 device-lost;`CONTRACT-P12.md`;阶段表行里的其余条目(`unix:` 监听、DirectGLES 去全局、freezer、多 context、FCL 开关接线、D8 白名单)。 +- 出口门 (b) 已于 2026-09-28、(a) 已于 2026-09-29 通过([`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md)、[`FCL-ACCEPTANCE.md`](FCL-ACCEPTANCE.md))。未完成:`CONTRACT-P12.md`;阶段表行里的其余条目(`unix:` 监听、DirectGLES 去全局、freezer、多 context、FCL 开关接线、D8 白名单)。 ## 阶段表行(原 `ROADMAP.md`) @@ -72,7 +72,7 @@ Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流** | G1 | ✅ pull 构建同机前后 `.text` 一致、符号 0 增 0 减 | ID-P12-15 | | 主机门 | ✅ unit 2605/2605,spawn / tcp 与三条 Magma 双进程车道全绿;剩余红全部归容器的 CMake/CTest 版本 | ID-P12-14 | | 真机七项检查(Redmi `2f7cbe2e`) | ✅ 审查轮之前(`29b7b284`)及审查后(`1fb18d9e`);审查后详细结果见上方复测补记 | PLAN-P12 §2、ID-P12-13 | -| 出口门 (a) | ❌ FCL 同机 spawn、双后端入世界、**杀 server** 产生干净 device-lost(本轮的驱动是 trace_replay,device-lost 由按 HOME 触发) | PLAN-P12 §3 | +| 出口门 (a) | ✅ 2026-09-29:FCL 里的 Minecraft 经 render server 屏渲染到 server 窗口,双后端入世界,`kill -9` server 后 client 闩住 device-lost、FCL 不崩(Magma 竖屏窗口画面位置不对,见文档) | [`FCL-ACCEPTANCE.md`](FCL-ACCEPTANCE.md) | | 出口门 (b) | ✅ 2026-09-28:WSL 里的 client 经 Wi-Fi TCP 重放 Minecraft 世界内 trace,rd12 ssim 0.999883、openra 1.0,251/251 与 128/128 帧,必测数已记录;client 是 trace 重放器,不是活的 Minecraft | [`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md) | ### 4. 在跑 @@ -81,7 +81,7 @@ Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流** ### 5. 下一步 -1. **出口门**:(b) 已过([`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md));剩 (a) FCL + 杀 server。 +1. **出口门**:(a) [`FCL-ACCEPTANCE.md`](FCL-ACCEPTANCE.md) 与 (b) [`CROSSHOST-ACCEPTANCE.md`](CROSSHOST-ACCEPTANCE.md) 都已通过;剩 `CONTRACT-P12.md`、门脚本误导输出、收官审查。 2. **收尾**:写 `MG_Remote/CONTRACT-P12.md`;修 `notes/p12/gate.sh` 的 G1 符号比较(与基准不同源,会印出误导的 `added=N removed=N`);按惯例做一次收官审查。 3. **阶段表行里的余项**(交接时在树上核过,均未做):in-process server 的 `unix:` 监听、DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局、cached-app freezer、多 context、FCL env 与 plugin 开关表接线、D8 窗口种类白名单。 4. 其后按 [`ROADMAP.md`](../../ROADMAP.md):monolith 跑道 P8;IPC 跑道 P9 → P10 → P11;P6.5 残余(39 例 device 矩阵 + 必测数)与 P3b/P4b 余项并行;`CONTRACT-P7.md` §12 的记录债按阶段认领。