Screenshot 长连接轻量化与按需保存开发方案 (FTI-005)
日期:2026-09-16 · 证据:E2 方案与设计契约 · 状态:approved
1. 核心目标与产品规则
- 截图采集使用独立长连接:Session 开始建立一次,固定 1 秒获取 1 张,Session 结束关闭。30 分钟测试由 1800 次进程启停/建连优化为 1 个 Worker 进程、1 条独立 DVT 连接、1800 次高效 RPC。
- 截图序列按需保存:用户勾选 Screenshot 则保存截图序列至
screenshots/;未勾选则绝不保存截图文件,不创建目录,30 分钟磁盘占用归零。
- 主页面顶部截图始终展示:只要 Session 正在采集,无论是否勾选 Screenshot,顶部均固定 1 秒刷新一次;内存仅保留最新单帧,RSS 保持有界。
核心原则:截图采集始终为实时预览服务;Screenshot 指标只决定是否保存历史截图序列。
2. 关键技术契约
- 与性能采集物理隔离:Screenshot 使用独立子进程与独立 DVT 连接,发生任何异常、超时或重连,绝不影响 Performance DTX,绝不影响 StartupTiming、FrameTime、CoreProfile 与其它性能指标。
- 定长前缀二进制 IPC(Zero Base64 / Zero Large JSON):
[HeaderLength: uint32 BE][Header JSON: UTF-8][PNGLength: uint32 BE][Raw PNG Bytes],避免 Base64 体积膨胀 33% 与 stdout 截断风险。
- Cadence 节奏控制与不追帧:Swift 控制 1 FPS 节奏,单次耗时超限时从完成时间向后推移 1 秒,绝不突发追帧。
- SessionArtifactPolicy 与 Rule 0 隔离:扩展
SessionStoragePolicy 包含 persistScreenshotSequence: Bool,不进入 CapturePlan.hash、不影响 CollectorReadiness。
- 僵尸进程防护:Python 守护线程监听父进程 PID 与 stdin EOF;Swift 负责生命周期回收,确保测试结束后
screenshot worker process count = 0。