万象:用户工具包的触摸与画面对照
本次补充从 Android 触摸输入到画面变化的对照。历史 API 回放审计测量的是另一段路径,数据保留,不混用百分比。
固定比较对象
| 对象 | 源码提交 | 构建 |
|---|---|---|
默认分支 fx-rime-only,含 Fcitx | cecea4940bb5a5db67f91d6b20e00ee5c97877ea | 仓库原有准备脚本与普通 Fx Debug |
| 中州鹅直连版 | cfd0ddc4d92dbcfcee815089ca34b97bdfa95780 | 完整 :app Fx Debug |
| 两版共同的 Rime prebuilt | 1126616c3ec569617da772e30d7a97f6b2694172 | x86_64 |
两个独立、固定提交的 checkout 只加入同一份 androidTest,构建前检查主程序与构建配置无改动。 工作仍在 feat/direct-rime-prototype,默认分支没有接收改动。 完整矩阵复用同批 APK,实际 APK 哈希、打包和加载的原生库随结果存档。 默认分支相比旧审计的 a714feff 多了输入记录、剪贴板和滑动方向修复,因此这是两版完整 产品路径的对照,差值不能全部算作某一个 Fcitx 路由函数的成本。
用户配置与模型
官方万象 v18.1.3 base + LTS,全拼,简码开启,小字集,上下文调频开启。 用户提供的模糊音、页大小 6、fallback reorder、候选注释和提示设置保留。
| 输入文件 | SHA-256 |
|---|---|
| v18.1.3 base ZIP | fc6495ba8489a898737ca29883dedaf61ff3baf593c78900dc59102c919d0e63 |
| LTS 模型 | 1849e5e4acbdbfaf41fceeb86b739d5d0c85d574bd8a688562cba1e6beb78488 |
原始 wanxiang.custom.yaml | 42bf76351ceb6f2db87396ae13edf9d9914712a065a61cdf74c66c52900c1319 |
原始 user.yaml | dd82ae3dc637e850446eb6e4170d916bb3d628b08d85572096c6b4c62ccb9a57 |
两份原始 YAML 在 config 中逐字节保留,包括 CRLF。 原始 user.yaml 没有保存 context_reorder。校准发现临时打开的状态在输入会话重建后 可能还原,所以两版的测试副本只额外加入 var/option/context_reorder: true。 其余用户 YAML 内容不变;每轮还核对真实编辑会话的“上下文开/简码开/小字集”、 部署后的页大小和 fallback 设置,以及 LTS 文件确实已映射。
LTS 是可变发布标签,在准备期间于北京时间 2026-10-17 17:59:19 更新。 本次固定上面的 asset 650124920,组合夹具 SHA-256 为 1193ad6abe18732a677c45da9b7f9a075606b7b98172a48e8bfebb1b5ee9d742。 旧审计的模型固定值不改;以后复现需要保留对应模型,不能删除哈希检查来绕过更新。 实际开关列表随结果记录,未将旧配置字段额外重命名成新版开关。
对用户工具的使用与修正
使用用户上传的《输入法性能对比报告与测试工具包.zip》,原 ZIP SHA-256 为 0f4b36b6c637369162e3f363628dde53475e933ed642b5b60bb37ceeacc66883。 核心 BenchTrace.java 原样执行; 四行键盘、三行候选、十六行编辑区压缩后逐帧差分,RGB 总差阈值固定为 60。
- Windows、固定屏幕坐标及原笔记应用依赖换成 Linux 和独立中立编辑器,按真实键位校准。 编辑器没有引擎依赖。清空使用原 Editable 并等待选择更新,避免测试程序人为重建输入连接。
- 原编码串不适用于全拼,改用固定 32 个全拼片段,含两个较长短句;每遍 264 键。
- 两版统一关闭按键气泡与水波纹,避免气泡遮住候选区造成错误响应信号。 触摸 DOWN/UP 均走正常 Android 输入分发与实际键盘,两次同步注入之间等待 32ms。 这是最低等待量;实际 DOWN 到 UP 还包含分发等待,未单独记录 UP 时刻。
- 原
final_latency.js用候选结果寻找“最快”的时钟偏移,会抹掉真实平均延迟差。 本次不用该拟合:编辑器色块在输入前后各变色六次,以 Choreographer 帧时钟映射视频 PTS, 候选响应不参与对时。保留残差、前后漂移、实际帧时间和注入时刻。 - 保留每键到下一次候选区域变化的原工具指标;另列下一键之前首次变化及覆盖率。 空格上屏单独统计,不把等待后续拼音的时间算作上屏延迟。
脚本与完整方法见 tools/screen-perf。
RGB 差阈值与“多少像素算作变化”是两个不同参数。当前压缩区域以候选 ≥5、编辑区 ≥2 个变化像素作为主分析门槛;原 final_latency.js 使用候选 >25、编辑区 >15。 归档保留逐帧像素计数,另用原门槛复算敏感性,不根据哪组数字更好看来选择主结果。
环境与统计边界
在同一个 GitHub KVM Android 35 Google APIs x86_64 模拟器依次运行两版,使用相同主题、 布局、编辑器、方案和模型。运行前停止另一版,每轮恢复同一测试配置并删除专用档案的 学习数据库;相同三词预热后清空编辑器。没有导入个人长期词库或手动排序历史。
完整矩阵为每版计划 160ms 间隔三轮、120ms 一轮、固定种子 90–230ms 抖动一轮, 交替先后顺序,共 4,752 次触摸按键。另跑一遍和两遍语料的硬件参考,对每轮完整提交 文本逐字比较。同步注入在系统忙碌时会晚于计划,记录每键实际间隔及逾期量, 不能假定两版承受严格相同的瞬时输入速率。总时长不作为最大吞吐量结论。
延迟为设备触摸 DOWN 至录屏中的区域变化,包含输入分发、引擎、界面与采样,并记录 至少 32ms 的按住条件。它不是纯引擎耗时或真机触摸到光子的延迟。画面不变的键不等于丢键, 最近按键归因不等于引擎净成本。每轮分位数取中位数并列范围,不把相关按键当成独立实验。 CPU/PSS 包含相同 instrumentation 的成本;录屏和模拟器也限制外推,不能据此宣称电池收益。
结果
正式运行:39041913893, 测试脚本提交 1667daab3780ed97c679a4bd81d9c31eefa8bcbe,全部通过。 14 轮包括 4 轮硬件参考、10 轮触摸,共 4,752 次触摸与 1,584 次硬件参考按键。 同样输入长度下,所有轮次的完整提交文本逐字一致;每遍输出 76 个汉字,两遍为 152 个。 这表示两版与参考输出一致,不是人工标注的汉字识别准确率。例如 zhongzhou 首选为“纵轴”, 最后一个长句首选为“我们以汽车是输入法”;测试没有改词或把共同的首选错误计为正确识别。
结论:本轮没有证明稳定的整链路提速或 CPU/PSS 收益。 常速候选 P50 几乎持平;候选 P95 略低,但下一键前响应 P50、上屏尾延迟和其他场景没有一致优势。 不能把下面的微小差值外推为真机收益,也不能把旧 API 回放的 6%/7% 套到触摸延迟。
常速三轮
以下为各轮统计量的中位数;括号内为三轮范围。延迟单位 ms。
| 指标 | 默认分支 Fcitx | 直连 |
|---|---|---|
| 每键到下一候选变化 P50 | 119.7(119.0–125.5) | 119.0(116.2–121.6) |
| 每键到下一候选变化 P95 | 327.6(322.9–332.6) | 317.8(306.1–321.7) |
| 下一键前的首次候选变化 P50 | 83.5(81.0–85.9) | 86.8(84.4–91.5) |
| 下一键前的首次候选变化 P95 | 181.5(177.2–192.7) | 174.9(170.5–175.9) |
| 空格到编辑区变化 P50 | 114.9(108.5–117.2) | 116.7(108.6–121.1) |
| 空格到编辑区变化 P95 | 285.4(236.7–309.8) | 299.8(290.4–308.4) |
| 每轮 528 键的进程 CPU,秒 | 28.40(28.35–31.17) | 28.56(27.33–29.22) |
| 输入循环结束 PSS,MiB | 316.76(316.01–317.57) | 316.44(316.16–317.98) |
下一键前首次变化的覆盖率分别为 66.1%/67.8%(三轮中位数)。 未覆盖的键可能没有改变候选画面,或变化在下一键之后;不能据此推算丢键率。 常速空格画面检测分别为 192/192、191/192;所有提交文本仍完全一致。 进程 CPU 仅累计输入循环,PSS 在循环结束取样,均含测试组件;不代表整机能耗或应用峰值内存。
快速计划与抖动轮
各场景每版只有一轮,下面的单轮值不构成稳定收益;数字为 P50 / P95,单位 ms。
| 场景 | 版本 | 每键到下一候选变化 | 下一键前首次候选变化 | 空格到编辑区变化 |
|---|---|---|---|---|
| 计划 120ms | Fcitx | 116.6 / 309.6 | 82.5 / 175.7 | 120.9 / 271.7 |
| 计划 120ms | 直连 | 123.1 / 336.2 | 84.3 / 184.1 | 118.1 / 270.0 |
| 计划 90–230ms 抖动 | Fcitx | 127.9 / 351.1 | 85.9 / 199.5 | 108.1 / 301.9 |
| 计划 90–230ms 抖动 | 直连 | 130.5 / 332.7 | 83.1 / 197.4 | 141.1 / 338.6 |
实际输入节奏与对时
| 轮次 | 实际键间隔均值,ms | 键间隔 P95,ms | 相对计划迟到 P95,ms | 对时前后漂移,ms |
|---|---|---|---|---|
| steady-r1-fcitx | 162.4 | 232 | 1320 | -5.5 |
| steady-r1-direct | 165.2 | 236 | 2558 | 0.7 |
| steady-r2-direct | 163.1 | 238 | 1356 | 11.6 |
| steady-r2-fcitx | 164.6 | 235 | 2076 | -5.0 |
| steady-r3-fcitx | 167.6 | 244 | 3526 | 3.8 |
| steady-r3-direct | 163.4 | 240 | 1808 | 4.4 |
| fast-direct | 165.6 | 249 | 22904 | 4.1 |
| fast-fcitx | 164.1 | 235 | 21862 | 2.1 |
| jitter-fcitx | 168.7 | 256 | 2465 | 4.2 |
| jitter-direct | 166.6 | 233 | 1882 | -1.4 |
计划 120ms 的快速轮没有达到目标压力:两版实际均值约 164–166ms,且累计迟到 P95 已达约 22 秒。 所以它只是在“尽快同步注入”条件下的观察,不能证明严格 120ms 连续输入不丢键,也不能当作最大吞吐测试。 常速实际均值约 162–168ms,两版也存在节奏波动。若要研究更快输入,应另做独立发键、准确记录 UP 与异步队列积压的测试,不用本轮数据替代。
显示设备报告 1080×1920、420dpi、约 60Hz;编码器实际输出 1080×1920 的变帧率视频。 各录像 PTS 帧间隔中位数约 100–110ms、P95 约 252–323ms;变帧率包含静止画面合并, 不能把名义 60Hz 当作每 16.7ms 都有一张独立的新录像帧。独立色块每轮 12 次匹配均通过, 残差跨度 14.3–33.5ms,前后漂移绝对值不超过 11.7ms;约 0.8ms 的常速候选 P50 差异没有可解释的精度。
变化像素门槛敏感性
同一批轨迹、同一色块时钟,改用原 final_latency.js 的候选 >25、编辑区 >15 门槛。 候选指标在全部十轮与主分析相同。编辑区严格门槛明显改变检测结果,常速三轮汇总如下:
| 指标 | Fcitx | 直连 |
|---|---|---|
| 空格上屏 P50 | 274.3 ms | 279.8 ms |
| 空格上屏 P95 | 466.7 ms | 458.4 ms |
| 检测到的空格上屏 | 162/192(各轮 57, 61, 44) | 179/192(各轮 59, 61, 59) |
严格门槛会漏掉压缩后较小的文本变化,并可能匹配到更晚的编辑区变化;主门槛也不能消除所有画面采样误差。 因此不依据这项分析选择一组更好看的百分比;上屏结论是没有一致提速证据。 完整复算见 sensitivity.json,可对保留的压缩轨迹运行 tools/screen-perf/sensitivity.py。
运行组件及归档
两版 LTS 映射与实际选项均逐轮核验。Fcitx 版 APK/进程含 Fcitx5Core、Utils、Config、 AndroidFrontend、通知、剪贴板及 Rime 插件等 9 个原生库;直连 APK/进程只有 libdirect-rime.so 和 libc++_shared.so,全部 7 轮直连记录均未映射 Fcitx Core。 这是运行组件核验,与“是否更快”是两个需要分别举证的问题。
永久原始记录在 perf/2026-10-17-wanxiang-screen: 保留 14 轮实际事件、完整参考文本、有效配置、输入前后宿主状态、内存快照、10 份逐帧差分和 PTS、 独立对时残差、APK/工具/模型校验值以及汇总。压缩只改变存储形式,不删减轨迹内容。 本地重算 comparison.json 与 CI 版本逐字节一致,另有独立 verification.json 核验记录。 原始视频约 55 MB,随正式运行的独立 artifact 保存至 2026-10-31;APK artifact 保存至 2026-10-20。
校准与 CI 记录
正式矩阵使用通过配置、提交文本和独立对时检查的固定 APK。此前校准运行未并入性能结果:
39023446963:LTS 可变发布更新,固定哈希检查阻止使用不同模型。39024457209:构建两版固定 APK;发现真实编辑会话需要从配置保存上下文调频状态。39040359665:测试编辑器的setText引发输入连接重启,改用原 Editable 清空并等待选择更新。39040919285:短轮提交文本一致,录屏已保存;分析参数不兼容云端 FFmpeg。 随后用这份实际录像验证兼容修复和独立对时,没有把校准数据拼入正式矩阵。39041560189:发现滤镜时间基准问题后主动取消,改用显式时间基准并在实际录像上验证。
产品源码没有因这些测试工具修正而改变。e8fffb64 的 PR CI 和 Direct Rime experiment 均通过,包括 471 项 JVM 单测、四 ABI 核验、原生检查及 7 项完整前端设备回归。