# Earth 模块整治计划 ## 背景 `planet` 前端中的 Earth 模块是当前最重要的大屏 3D 星球展示能力,但它仍以 legacy iframe 页面形式存在: - React 页面入口仅为 [Earth.tsx](/home/ray/dev/linkong/planet/frontend/src/pages/Earth/Earth.tsx) - 实际 3D 实现位于 [frontend/public/earth](/home/ray/dev/linkong/planet/frontend/public/earth) 当前模块已经具备基础展示能力,但在生命周期、性能、可恢复性、可维护性方面存在明显隐患,不适合长期无人值守的大屏场景直接扩展。 ## 目标 本计划的目标不是立刻重写 Earth,而是分阶段把它从“能跑的 legacy 展示页”提升到“可稳定运行、可持续演进的大屏核心模块”。 核心目标: 1. 先止血,解决资源泄漏、重载污染、假性卡顿等稳定性问题 2. 再梳理数据加载、交互和渲染循环,降低性能风险 3. 最后逐步从 iframe legacy 向可控模块化架构迁移 ## 现阶段主要问题 ### 1. 生命周期缺失 - 没有统一 `destroy()` / 卸载清理逻辑 - `requestAnimationFrame` - `window/document/dom listeners` - `THREE` geometry / material / texture - 运行时全局状态 都没有系统回收 ### 2. 数据重载不完整 - `reloadData()` 没有彻底清理旧场景对象 - cable、landing point、satellite 相关缓存与对象存在累积风险 ### 3. 渲染与命中检测成本高 - 鼠标移动时频繁创建 `Raycaster` / `Vector2` - cable 命中前会重复做 bounding box 计算 - 卫星每帧计算量偏高 ### 4. 状态管理分裂 - 大量依赖 `window.*` 全局桥接 - 模块之间靠隐式共享状态通信 - React 外层无法有效感知 Earth 内部状态 ### 5. 错误恢复弱 - 数据加载失败主要依赖 `console` 和轻提示 - 缺少统一重试、降级、局部失败隔离机制 ## 分阶段计划 ## Phase 1:稳定性止血 目标: - 不改视觉主形态 - 优先解决泄漏、卡死、重载污染 ### 任务 1. 补 Earth 生命周期管理 - 为 [main.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/main.js) 增加: - `init()` - `destroy()` - `reloadData()` 三类明确入口 - 统一记录并释放: - animation frame id - interval / timeout - DOM 事件监听 - `window` 暴露对象 2. 增加场景对象清理层 - 为 cable / landing point / satellite sprite / orbit line 提供统一清理函数 - reload 前先 dispose 旧对象,再重新加载 3. 增加 stale 状态恢复 - 页面重新进入时,先清理上一次遗留选择态、hover 态、锁定态 - 避免 iframe reload 后出现旧状态残留 4. 加强失败提示 - 电缆、登陆点、卫星加载拆分为独立状态 - 某一类数据失败时,其它类型仍可继续显示 - 提供明确的页面内提示而不是只打 console ### 验收标准 - 页面重复进入 / 离开后内存不持续上涨 - 连续多次点“重新加载数据”后对象数量不异常增加 - 单一数据源加载失败时页面不整体失效 ## Phase 2:性能优化 目标: - 控制鼠标交互和动画循环成本 - 提升大屏长时间运行的稳定帧率 ### 任务 1. 复用交互对象 - 复用 `Raycaster`、`Vector2`、中间 `Vector3` - 避免 `mousemove` 热路径中频繁 new 对象 2. 优化 cable 命中逻辑 - 提前缓存 cable 中心点 / bounding 数据 - 移除 `mousemove` 内重复 `computeBoundingBox()` - 必要时增加分层命中: - 先粗筛 - 再精确相交 3. 改造动画循环 - 使用真实 `deltaTime` - 把卫星位置更新、呼吸动画、视觉状态更新拆成独立阶段 - 为不可见对象减少无意义更新 4. 卫星轨迹与预测轨道优化 - 评估轨迹更新频率 - 对高开销几何计算增加缓存 - 限制预测轨道生成频次 ### 验收标准 - 鼠标移动时不明显掉帧 - 中高数据量下动画速度不受帧率明显影响 - 长时间运行 CPU/GPU 占用更平稳 ## Phase 3:架构收编 目标: - 降低 legacy iframe 架构带来的维护成本 - 让 React 主应用重新获得对 Earth 模块的控制力 ### 任务 1. 抽离 Earth App Shell - 将数据加载、错误状态、控制面板状态抽到更明确的模块边界 - 减少 `window.*` 全局依赖 2. 规范模块通信 - 统一 `main / controls / cables / satellites / ui` 的状态流 - 明确只读配置、运行时状态、渲染对象的职责分层 3. 评估去 iframe 迁移 - 中期可以保留 public/legacy 资源目录 - 但逐步把 Earth 作为前端内嵌模块而不是完全孤立页面 ### 验收标准 - Earth 内部状态不再大量依赖全局变量 - React 外层可以感知 Earth 加载状态和错误状态 - 后续功能开发不再必须修改多个 legacy 文件才能完成 ## 优先级建议 ### P0 - 生命周期清理 - reload 清理 - stale 状态恢复 ### P1 - 命中检测优化 - 动画 `deltaTime` - 数据加载失败隔离 ### P2 - 全局状态收编 - iframe 架构迁移 ## 推荐实施顺序 1. 先做 Phase 1 2. 再做交互热路径与动画循环优化 3. 最后再考虑架构迁移 ## 风险提示 1. Earth 是 legacy 模块,修复时容易牵一发而动全身 2. 如果不先补清理逻辑,后续所有性能优化收益都会被泄漏问题吃掉 3. 如果过早重写而不先止血,短期会影响现有演示稳定性 ## 当前建议 最值得马上启动的是一个小范围稳定性 sprint: - 生命周期清理 - reload 全量清理 - 错误状态隔离 这个阶段不追求“更炫”,先追求“更稳”。稳定下来之后,再进入性能和架构层的优化。