Appearance
轻量响应式刷新系统
系统概览
轻量响应式系统:Proxy 拦截 set → requestAnimationFrame 去抖 → 通知所有订阅者(通常是 SlideMenu.updateControls())。替代手动在状态变更处逐一调用刷新,是 UI 与全局状态解耦的刷新总线。
核心职责
scheduleRefresh()— RAF 去抖,同帧多次调用只触发一次刷新subscribe(fn)— 注册刷新订阅者,返回取消订阅函数unsubscribeAll()— 清空全部订阅者(供initScene重入时调用,ADR-106 D3 HMR 清理入口)reactive(obj)— 用 Proxy 包裹对象,属性赋值自动触发scheduleRefresh();深度代理嵌套普通对象(WeakMap缓存保证引用稳定),不代理数组/Map/Set
关键约定(数组 / 引用类型)
- Proxy 不代理数组/Map/Set,故
envState.skyColorTop[0] = 0.5不会触发刷新 - 写入数组/tuple3 必须整体替换:
envState.skyColorTop = [0.5, 0.6, 0.7]或经setEnvState({...})内部Object.assign整体赋值 - set 拦截做同值短路(
Object.is),避免无意义刷新(P3 防御)
与其他子系统关系
state.ts的setEnvState经 Proxy 整体赋值触发刷新observer-handle.ts的subscribe订阅者通常是菜单的updateControls()render-loop.ts的applyScaling等状态变更经此处去抖刷新 UI