diff --git a/docs/superpowers/specs/2026-04-26-pixi-dx-runtime-assets-redesign-design.md b/docs/superpowers/specs/2026-04-26-pixi-dx-runtime-assets-redesign-design.md new file mode 100644 index 0000000..9ebdd73 --- /dev/null +++ b/docs/superpowers/specs/2026-04-26-pixi-dx-runtime-assets-redesign-design.md @@ -0,0 +1,299 @@ +# Pixi 框架重构设计(DX 优先,性能其次) + +## 背景与目标 + +本设计用于指导 `pixi-demo` 的新一轮框架重构。重构范围聚焦两部分: + +- 核心运行时(`Game + Scene + 生命周期 + 插件机制`) +- 资源系统(`AssetManager + manifest + 预加载/引用追踪/调试信息`) + +约束和原则: + +- 目标平台:Web H5 优先 +- 兼容策略:彻底升级(允许批量改场景代码,换取更干净的架构) +- 优先级:开发者体验第一,性能第二 +- 允许任意重构 +- 需要内置一组服务开发流程的 UI 能力 + +## 设计原则 + +1. 可观测优先:所有关键行为都能在开发态被看见和解释。 +2. 状态可证明:场景与资源都由明确状态机驱动,不依赖隐式约定。 +3. 边界清晰:运行时、场景、资源、开发工具分层解耦,减少跨层直接访问。 +4. 失败可恢复:切换和加载过程默认考虑失败与回滚,不把异常当特例。 +5. 渐进性能:先构建可测量基础,再做高收益优化,避免盲目微调。 + +## 总体架构 + +### 1) `kernel`(运行时内核) + +职责: + +- 管理 `AppRuntime`(renderer/ticker/stage) +- 编排生命周期与切换事务 +- 提供插件总线与统一错误边界 + +非职责: + +- 不承载业务场景逻辑 +- 不直接持有业务资源映射 + +### 2) `scene`(场景域) + +职责: + +- 场景注册(`SceneRegistry`) +- 场景切换(`SceneTransition`) +- 场景上下文(`SceneContext`) + +场景统一生命周期: + +- `created -> setup -> assetsLoading -> entering -> ready -> leaving -> disposed` + +### 3) `assets`(资源域) + +职责: + +- 资源依赖图(`AssetGraph`) +- 场景资源会话(`AssetSession`) +- 引用追踪与释放策略 +- 预加载与复用策略 + +### 4) `devtools`(开发体验层) + +职责: + +- 开发态 overlay +- 运行时事件时间线 +- 场景/资源检视器 +- 命令面板(Command Palette) + +约束: + +- 仅通过事件与快照读取状态,不直接修改业务状态 + +### 5) `ui-core`(内置 UI 基础层) + +第一阶段只服务开发工具界面,不直接扩展为完整业务 UI 框架。提供最小组件集: + +- `UiPanel` +- `UiText` +- `UiButton` +- `UiList` + +## 模块边界约束 + +- 场景层不得直接调用 Pixi `Assets` 全局对象,只能通过 `SceneContext.assets`。 +- 资源层不得感知具体场景类实现,只识别 `ownerId/sessionId`。 +- 运行时内核不直接 import 业务场景文件,场景通过注册机制注入。 +- devtools 读取运行时快照和事件流,避免写入造成调试副作用。 + +## 生命周期与数据流设计 + +## 场景状态机定义 + +### `setup` + +- 创建静态显示对象结构 +- 绑定事件与命令 +- 禁止异步资源请求 + +### `assetsLoading` + +- 通过 `AssetSession` 申请 bundle 及依赖 +- 记录 owner/session 关系 + +### `entering` + +- 资源就绪后的首帧布局 +- 进入动画和交互解锁前处理 + +### `ready` + +- 场景可交互的稳定状态 + +### `leaving` + +- 停止输入和 ticker 订阅 +- 准备切换和资源释放 + +### `disposed` + +- 场景彻底释放,不再允许引用 +- 需要复用时重新实例化 + +## 场景切换事务(Transition Transaction) + +切换流程固定为: + +1. `beginTransition(from, to)` +2. `freezeInput(from)` +3. `prepare(to)`(`setup + assetsLoading`) +4. `commit()`(舞台替换 + `entering`) +5. `finalize(from)`(`leave + dispose/unmount`) +6. `emitTransitionReport()` + +失败处理: + +- 任一阶段失败触发 `rollback()` +- 回退到 `from.ready` +- 记录失败阶段与异常信息 +- 通过 dev overlay 展示失败链路 + +## 资源会话模型(AssetSession) + +每次场景进入创建 `AssetSession(sceneId, transitionId)`,示例: + +- `session.require("bundle.home")` + +内部行为: + +- 解析 `AssetGraph` 依赖关系(如 `home -> common-ui -> common-audio`) +- 记录引用链:`asset <- bundle <- session <- scene` +- 在 `commit` 成功后再释放旧场景 session + +释放策略: + +- 支持短延迟释放窗口(例如 2s),降低快速来回切场造成的重复加载抖动 + +## 可观测事件流 + +内核输出统一事件流: + +- `scene:state-changed` +- `transition:started|committed|rolledback|finished` +- `asset:request|loaded|reused|released|orphan-detected` +- `runtime:error` + +该事件流同时服务日志、overlay、定位与回归验证。 + +## 开发体验能力(MVP) + +## Debug Overlay(开发态默认启用) + +至少展示: + +- 当前场景与状态 +- 切换耗时 +- 最近运行时事件(最近 20 条) +- FPS 和 ticker 开销 +- bundle 引用树(owner/session) +- 最近错误与 phase + +支持快捷键开关(例如 `~`)。 + +## Scene Inspector(最小版) + +展示场景树(scene id/state/mounted)并支持开发命令: + +- `reload current scene` +- `simulate transition failure` +- `force release assets(session)` + +## Asset Inspector(最小版) + +展示: + +- `bundle -> assets -> owners` +- orphan 资源 +- 高频重复加载 bundle +- 长驻 bundle 总量 + +## Runtime Command Palette + +支持开发命令调用,例如: + +- `scene.goto(welcome)` +- `asset.preload(bundle.xxx)` +- `dev.toggleOverlay()` + +## 性能策略(第一阶段) + +在不牺牲 DX 的前提下做低侵入优化: + +- overlay 刷新节流(例如 200ms) +- 通过可观测数据驱动资源预热,而非猜测 +- 切场资源释放使用短延迟窗口平衡内存与流畅度 + +## 测试与验收标准 + +## Definition of Done + +### 运行时稳定性 + +- 场景切换 100 次无卡死、无黑屏、无未捕获异常 +- 切换失败可回滚到上一场景 `ready` + +### 资源可追踪性 + +- 每个已加载 bundle 都可查看 owner/session +- 切场后无长期 orphan 残留(延迟释放窗口内短暂存在可接受) + +### 开发体验 + +- overlay 可一键开关且不阻断交互 +- 至少 8 条 runtime 命令可执行 +- 报错可定位到生命周期 phase + +### 可维护性 + +- 生命周期、切换事务、资源图关键路径具备单测 +- 新场景模板可在 5 分钟内创建并跑通 + +## 测试策略 + +### 单元测试 + +- `SceneStateMachine` 状态迁移合法性 +- `TransitionTransaction` 的 commit/rollback 分支 +- `AssetSession` 引用计数与释放顺序 + +### 集成测试 + +- 场景 A->B->A 快速切换与资源抖动 +- bundle 加载失败与恢复 + +### 手工验证(开发态) + +- overlay 信息正确性 +- command palette 链路可用性 +- 长时间运行资源引用稳定性 + +## 实施里程碑 + +### M1:运行时内核重构(约 1 周) + +- 新 lifecycle 与 transition transaction +- 插件总线 +- 基础 overlay(状态与耗时) + +### M2:资源系统重构(约 1 周) + +- `AssetGraph + AssetSession` +- `Asset Inspector` +- 预热与延迟释放 + +### M3:DX 强化(约 1 周) + +- command palette +- 场景模板与错误提示优化 +- 验收测试补齐 + +## 风险与应对 + +- 风险:彻底升级导致迁移期间业务场景不可用。 + - 应对:按里程碑提供最小迁移适配层,仅用于过渡,M3 后清理。 +- 风险:devtools 与运行时耦合过深。 + - 应对:强制事件总线和只读快照接口,禁止直接写内核状态。 +- 风险:资源引用关系复杂导致误释放。 + - 应对:`owner/session` 双维追踪 + release 日志审计 + 回归用例。 + +## 非目标(当前阶段不做) + +- 完整业务 UI 组件库建设 +- 多端宿主统一适配层(小程序/小游戏) +- 高级渲染性能专项(需在可观测基础稳定后进行) + +## 结论 + +本方案以“内核先重构、资源系统同步升级、开发工具前置落地”为主线,保证在重构初期即提升开发者体感,并通过可观测与状态机约束降低后续维护成本。第一阶段以可看见、可定位、可恢复为核心交付,性能优化作为可量化的后续迭代项推进。