From 6e35ea2c029e7f2b0bf28ab00bf48b2f0d62b388 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 29 Sep 2026 00:54:46 -0400 Subject: [PATCH] [Docs] (P12): the portrait-window clipping was the 0x0 window request, not Magma - root cause, fix and evidence --- docs/Disaggregated/CURRENT_STAGE_PROGRESS.md | 2 +- docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md | 13 +++++++++++-- tools/device_bench/disagg/fcl_accept.sh | 3 +++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md index 2a4099d9..e76ad01a 100644 --- a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md +++ b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md @@ -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 后干净报"设备丢失" | ✅ 2026-09-29:Render Server 屏 + FCL(新增版本设置「游戏退到后台时不暂停」),双后端入世界,杀 server 后 33–54 ms 闩住 device-lost,FCL 不崩;[`notes/p12/FCL-ACCEPTANCE.md`](notes/p12/FCL-ACCEPTANCE.md)。Magma 竖屏窗口画面位置不对,未查 | +| 验收 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)。竖屏 server 窗口里画面被裁的问题已查明并修复(client 请求尺寸为 0×0,现在取 native window 的大小) | | 验收 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) diff --git a/docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md b/docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md index c44fbfbe..070f60b7 100644 --- a/docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md +++ b/docs/Disaggregated/notes/p12/FCL-ACCEPTANCE.md @@ -13,7 +13,7 @@ | 后端 | 入世界、画面上屏 | `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) | +| Magma(DirectVulkan) | ✅ 画面上屏、`present` 持续增长;竖屏窗口里也是完整画面(几何修复后) | `DEVICE LOST`(1 行),33 ms(修前构建,精确计时);修后构建同样闩锁 1 次 | 进程还在(修前 ≥ 30 s;修后 ≥ 10 s) | ## 为了跑通做的三件事 @@ -28,7 +28,16 @@ ## 没验证 / 观察到的 -- **Magma 在竖屏 server 窗口里画面位置不对**:游戏帧 2620×1280,窗口 1280×2620,画面只出现在窗口下部、被裁掉一部分;Espryt 那次是横屏窗口,没有这个现象。是几何 / 预旋转问题,还没查。 +- (已修)竖屏 server 窗口里画面被裁:见下一节。 - 没测性能、没测输入(server 窗口不转发触摸,游戏是自己进世界的,没有人操作)、没测长时间稳定性。 - 时序有要求:FCL 的 JVMActivity 出现后要再等约 10 s 才把 server 窗口切到前台,否则游戏因 surface 未就绪卡住启动。 - 每个后端只跑了一遍。 + +## 竖屏窗口里画面被裁(已修) + +**现象:** server 窗口是竖屏(1280×2620)时,游戏帧 2620×1280 只画出左下角 1280×1280 的一块,热键栏被切掉一半。最初只在 Magma 上看到,**Espryt 在竖屏窗口里同样被裁,Magma 在横屏窗口里是对的**——所以不是后端问题,是窗口方向。 +**根因:** SDL(Minecraft 的 Android 后端)建 EGL window surface 时不带 `EGL_WIDTH` / `EGL_HEIGHT`,client 于是向 server 请求 **0×0**("用 server 窗口自己的大小");server 窗口取了竖屏尺寸,client 的默认帧缓冲就成了 1280×2620, +而游戏按它自己的窗口(FCL 的 2620×1280)渲染,1:1 画进去就被裁了。server 侧其实早就支持"client 指定尺寸 → `setFixedSize` + 视图等比留黑边"(`MobileGLDisplayActivity`),只是这一路没人传尺寸。 +**修法:** `EGLImpl::CreateWindowSurface`(split 构建、Android、server-owned 窗口)在没有 `EGL_WIDTH/HEIGHT` 时用传进来的 native window 的 `ANativeWindow_getWidth/Height` 作请求尺寸。 +修后日志 `display geometry 2620x1280 requested (SurfaceHolder.setFixedSize)`,竖屏窗口里显示完整的一帧、上下留黑边,两个后端都一样(截图 `geom-*-portrait-fixed.png`)。 +**没验证:** 修后的横屏窗口没有重测(这台机的 `cmd window user-rotation lock 1` 没让显示转过去;修前横屏两个后端都是对的,请求尺寸与窗口相同,理应不变)。 diff --git a/tools/device_bench/disagg/fcl_accept.sh b/tools/device_bench/disagg/fcl_accept.sh index 5b85f99f..ab8f09d6 100644 --- a/tools/device_bench/disagg/fcl_accept.sh +++ b/tools/device_bench/disagg/fcl_accept.sh @@ -21,6 +21,9 @@ A() { adb -s "$S" "$@"; }; Ash() { adb -s "$S" shell "$@" | tr -d '\r'; } log() { echo "[$(date +%H:%M:%S)] $*"; } A shell "am force-stop $F; am force-stop $T; input keyevent KEYCODE_WAKEUP; input keyevent 82; svc power stayon true" +# ROTATION=0|1|2|3 pins the display rotation for the run (0 = portrait, 1 = landscape); freed at the end. +[ -n "${ROTATION:-}" ] && A shell "cmd window user-rotation lock $ROTATION" +trap '[ -n "${ROTATION:-}" ] && A shell "cmd window user-rotation free"' EXIT A shell "printf 'MOBILEGL_BACKEND_TYPE=$BACKEND\nMOBILEGL_IPC_CONTROL=tcp://127.0.0.1:40613\nMOBILEGL_IPC_DATA=stream\nMOBILEGL_IPC_SURFACE=server\n' > /sdcard/FCL/mg_env.txt; echo spawn > /sdcard/FCL/mg_transport.txt" A shell "run-as $F grep -c keepRunningInBackground files/config.json" | grep -q '^[1-9]' || { log "FATAL: keepRunningInBackground is not set in FCL's config.json"; exit 1; } A logcat -c