mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-15 12:15:16 +00:00
生产库 3754 块时,buildChatStarmapGraph 在内联脚本里同步跑 50 轮全对全 (O(n²))斥力:每轮 704 万次配对,50 轮共 3.52 亿次。CDP Profiler 实测 单次阻塞主线程 10.9 秒,页面启动首帧 11.8 秒;PerformanceObserver 在 40 秒窗口统计到累计 40,005ms 长任务。 两条独立问题叠加,本提交分别解决: ① O(n²) → 网格近邻(O(n·k)) 斥力体里本来就有 `if (d < 25)` —— 只对近邻施力,全对全是白算。 改为 3×3×3 网格分桶,只遍历邻近格。实测 3754 节点 7016ms → ~120ms。 ② 同线程 → Web Worker 即使算量合理也不该占主线程。计算整体移入 static/starmap-layout-worker.js,主线程零阻塞。 配套:迭代数按 n 自适应(小图跑满 50 轮,大图退到 14 轮)+ 迭代间早停 (阈值取平均间距的 0.2%,随规模自适应)。 ★ 串行回退(file://、老浏览器、Worker 构造失败)必须用**同一算法**。 若回退走旧全对全,两条路径会给出不同布局 —— 「有 Worker 和没 Worker 看到的图不一样」极难排查。故两边各写一份逐字对应的实现。 ★ 另修:renderChatStarmap 必须在容器不可见时提前返回(offsetParent)。 starmapActiveContainer 会 fallback 到聊天面板,导致未打开星图也被迫 建图,把聊天页签一起拖死。 判据 TestStarmapNoPerFrameFullScan 同时覆盖两处实现,经三向变异验证: ① 回退改回 Object.keys 全对全 → FAIL ② Worker 去掉 CUTOFF 网格法 → FAIL ③ 删除 Worker 文件 → FAIL