最大化长文档与导图演示压力测试(2026-10-17)
后续 Windows 源码按行布局、渲染后端对照、深滚动及关闭复验见源码按行布局与渲染后端复验。本报告保留此前全文 TextField / Impeller 基线。
本轮应用源码为 401ca15。报告只覆盖 Windows 原生 Profile,不代表其他平台已通过性能或完整 Markdown 兼容性验收,也不作为 98% 视觉还原率的证明。
条件
- Flutter 3.47.7 / Dart 3.13.5,Windows x64,正式应用与测试共用自定义标题栏初始化。
- 每项操作确认窗口保持最大化:外框 3456×1408,Flutter 客户区 3440×1392,DPR 1。
- 六份文档来自用户指定的只读样本,分别包含技术方案、大型混合内容、综合语法、长代码、密集公式及容错边界;不提交原文、原文件名或公司路径。
- 输入先读入内存仓储,禁用实际文件监听;打开计时不包含磁盘读取。源文与未修改状态逐项校验。
覆盖
每份文档遍历八种布局,逐个正文滚动区执行上下拖动、85% / 15% / 末尾 / 开头跳转。随后反向切换六份文档六轮,每轮切换三视图、即时+导图、源码+渲染和即时编辑;其中三轮逐视图滚动,另三轮进入演示。
共 24 次演示流程,每次检查首、中、末页及返回首页、250% 正文字号、长页滚动、正文 / 导图互切、全图适配、离屏节点聚焦、导图平移缩放与退出。退出后核对原布局、选区、源文和未修改状态。批量演示保持最大化;原生全屏进入与退出恢复在窗口专项单独验证。
总览优化与失败记录
解除导图 15% 缩放下限后,完整大图会同时显示上千个节点。原实现为每个节点创建文字、拖动和折叠控件,采样 RSS 达 1631.5 MiB。
这份优化前记录在完成 748 项后,因测试通过旧 Scrollable 控件对象查找滚动区失败而中断。其状态明确标为 aborted,不是整轮通过;旧测试未将步骤内抛出的异常写入操作数组,因此其中 errors: 0 也不能解释为通过。日志与失败步骤用于定位,不将缺失步骤填零或用于通过率计算。
优化后,超过 300 节点且低于 20% 的总览直接绘制卡片,放大或聚焦后恢复完整文字与交互;节点点击和双击仍可用。独立回归检查 1500 节点全图均在视口内,总览没有批量拖动控件,点击末尾节点后可回到可读倍率。测试现以挂载的滚动状态定位,步骤内异常也会持久化记录,并由 testCompleted 区分整轮完成与中断。
最终结果
优化后完整运行约 11 分 23 秒,756 项操作全部通过;testCompleted: true、pending: null,记录异常数为 0。共包含 6 次打开、48 次初始布局、36 次反向文档切换、144 次重复布局、186 次滚动操作和 336 次演示动作(包括 24 次全图适配)。匿名原始结果。
| 观测 | 本机单轮结果 |
|---|---|
| 采样最大 RSS | 1070.6 MiB |
| 反向文档切换中位数 / 最大值 | 76.9 / 107.8 ms |
| 全图适配中位数 / 最大值 | 36.8 / 95.0 ms |
| 最慢布局动作 | 1432.1 ms |
| 最慢构建帧 | 1344.7 ms |
| 最慢栅格帧 | 66.3 ms |
最慢构建发生在技术方案的源码+渲染布局;源码仍然存在超过一秒的布局停顿。本轮通过的是操作稳定性及内容完整性检查,性能尚未达到最终验收要求。 不同视口的数据不直接计算性能改善比例,优化前中断记录也不当作完整对照基线。
计时解释与边界
墙钟耗时包含测试手势和等待界面稳定,不是纯计算时间;最大构建 / 栅格耗时来自引擎批量上报,未收到帧时记录为 null,不当作 0 ms。RSS 是每项结束时的采样值,可能遗漏操作中的短时峰值。
源码仍使用全文 TextField,首次布局和内存仍需优化。测试中的公式、图表与代码是稳定性输入,不表示已经具备完整公式渲染、图表、高亮或编辑体验。代码横向滚动、跨块选择、输入法及其他平台仍需专项验证;没有据此声称 60 FPS 或达到 98%。
复测
在 apps/vex 执行 flutter drive --profile -d windows --driver test_driver/integration_test.dart --target integration_test/document_stress_test.dart --no-pub。设置 VEX_STRESS_INPUTS 为只读样本的绝对路径 JSON 数组、VEX_STRESS_OUTPUT 为本地结果文件、VEX_STRESS_ROUNDS=6、VEX_STRESS_DEEP_SCROLL=1。使用 scripts/summarize_stress.py 生成匿名结果。
有疑问或建议,欢迎到 GitHub 提交 Issue 参与讨论。