# 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 组件库建设 - 多端宿主统一适配层(小程序/小游戏) - 高级渲染性能专项(需在可观测基础稳定后进行) ## 结论 本方案以“内核先重构、资源系统同步升级、开发工具前置落地”为主线,保证在重构初期即提升开发者体感,并通过可观测与状态机约束降低后续维护成本。第一阶段以可看见、可定位、可恢复为核心交付,性能优化作为可量化的后续迭代项推进。