4.0 KiB
4.0 KiB
Earth Renderer / Logic Separation Plan
Source note: this plan absorbs useful ideas from a sisyphus-created draft formerly stored at
.sisyphus/plans/earth-architecture-refactor.md.
Goal
将 Earth 前端继续往“逻辑层 / 状态层 / 渲染层”分离推进,降低后续这几类工作的耦合成本:
- Three.js 渲染重构
- 部分图层替换实现
- 未来 UE / Cesium 客户端迁移
- Earth 行为逻辑复用
Why This Matters
当前 Earth 已经有一些良好分层,例如:
- 图层显隐入口
- Cable state 枚举与状态 map
- 交互逻辑与实际视觉效果的部分分离
但还没有形成一套更明确的统一规则。现在的风险是:
- 同一类对象的 hover / locked / hidden / loading 语义不一致
- 状态和渲染更新散落在多个模块
- 后续再加新图层时容易复制旧逻辑
Current High-Frequency Risks
1. Visual state and business state drift apart
Earth 里最常见的 bug 不是“没渲染”,而是状态没有一起收口:
- 图层关了,tooltip 还在
- 锁定对象隐藏了,info card 还在
- legend 没跟图层切换
- loading 已结束,但按钮还像没开
后续架构治理需要把这类同步责任从临时 UI patch 转为统一状态流。
2. HUD layout fixes skip structure analysis
Earth HUD 历史上反复出现:
- 面板只剩一条缝
- markdown 被裁掉
- tabs / iframe 被
overflow: hidden吃掉
这类问题应纳入布局治理计划,而不是散落在单个功能改动里临时修。
3. Transitional paths keep accumulating
Earth 已经经历过多轮 HUD、toolbar、media panel 重构,容易留下:
- 旧 helper
- 旧 class
- 旧 fallback 逻辑
- 已废弃变体
架构分离阶段需要把 cleanup pass 作为计划项,而不是让技术上下文承担提醒职责。
4. Cruise logic and business events couple too deeply
巡航相关风险是通用巡航层继续混入业务事件细节,导致 BGP、新闻、卫星、海缆各自复制一套状态机。
架构目标应保持:
- 通用巡航层管理目标、队列、focus、停留、隐藏和切换
- 业务模块只提供队列、坐标、卡片内容和高亮副作用
Target Architecture
Earth 对每类对象都尽量拆成三层:
-
state layer- 保存对象状态
- 例如:
normal / hovered / locked / hidden / loading
-
logic layer- 处理点击、悬停、锁定、过滤、显隐切换
- 不直接关心 Three.js 具体材质怎么改
-
renderer layer- 根据状态更新 Three.js / HUD 外观
- 是最容易针对不同渲染引擎替换的一层
Current Good Signals
当前已经接近这条方向的地方:
- cable 状态管理
- 部分 landing point 状态同步
- layer button 的统一状态入口
- tooltip / legend / info-card 开始朝状态驱动靠拢
Next Steps
1. Standardize object state enums
优先为这些对象建立更稳定的状态语义:
- cables
- satellites
- landing points
- BGP markers
- media / news 面板入口按钮
2. Unify state-to-visual adapters
为各模块建立更清晰的渲染适配函数,例如:
applyCableVisualState()applySatelliteVisualState()applyBGPVisualState()
要求:
- 逻辑层只改状态
- 视觉层负责把状态映射到材质、透明度、发光、尺寸、文字
3. Separate Earth UI state from render state
HUD / 面板 / 图层按钮状态也需要和渲染状态分离:
loadingactivelockedhiddenerror
不要再让 UI 通过“猜渲染结果”推导业务状态。
4. Prepare migration-safe boundaries
后续如果做 UE / Cesium 客户端,尽量保留:
- 状态枚举
- 交互规则
- 数据层接口
只替换:
- Three.js 具体渲染实现
- HUD 展示实现
Practical Rule
后续 Earth 新功能开发时,优先问三个问题:
- 这个状态由谁持有?
- 这个交互逻辑在哪一层处理?
- 这个视觉变化是否能在不改逻辑的情况下单独替换?
如果答不上来,就说明还在把状态、逻辑、渲染揉在一起。