Pascal Editor
Pascal 架构:扁平节点、注册表分发与持久场景版本
追踪一次建筑编辑如何从 Zustand 场景状态进入节点渲染和 SQLite,区分撤销历史、图形与持久化。
你将学会
- 以扁平映射保存图结构
- 节点定义决定数据如何变成画面
- 持久化是另一层权威状态
开始前需要
- 基础场景图、JavaScript 和 HTTP 知识
- 尺寸与关系具有明确预期的自有小场景
解释实现边界,复现本章检查清单或窄范围图练习。
先看结论
- 扁平场景图包含层级与插件上下文。
- 注册表和 GPU 就绪共同影响可见性。
- 撤销与持久版本检查是不同契约。
以扁平映射保存图结构
useScene 按 ID 保存节点,同时保存 rootNodeIds、材质、集合与 installedPlugins。层级关系由父子链接表达,而不是把完整模型直接嵌套到 React 组件中。初始场景显式双向连接场地、建筑和楼层,以兼容与渲染遍历采用不同关系检查方式的消费者。
setScene 执行兼容迁移,删除父节点缺失的节点,规范根集合,并在存在有效根时移除不可达节点。它一次写入被追踪状态,避免撤销历史暴露半规范化的中间场景。随后脏节点标记触发下游处理;脏集合本身不是持久化几何缓存。
节点定义决定数据如何变成画面
NodeRenderer 先检查节点是否存在、插件类型是否启用,以及注册表是否有定义。自定义渲染器通过 React.lazy 加载,并以来源身份为键存入 WeakMap;没有自定义渲染器但有 geometry 的定义使用通用参数化路径。定义缺失或不支持时不渲染,解释了数据存在却看不见的情况。
渲染能力模块请求 WebGPU 适配器与设备,为请求和初始化设置边界,必要时尝试 WebGL,并释放放弃的设备、清理失败的渲染器。注入模拟对象的实验验证了回退编排,没有验证真实着色器支持或画面等价。因此,复现问题时应记录实际图形后端。
持久化是另一层权威状态
SQLite 存储把场景序列化为 JSON,按 UTF-8 字节检查可配置上限,默认 10 MiB。save 在写事务内检查 expectedVersion,增加版本并写入修订。显式命名且已存在的场景不能在缺少预期版本时被 save 覆盖。这是具体并发契约,不是自动冲突合并。
返回元数据含 published: true,但对这个本地存储而言,它是状态字段,不是已经部署互联网地址的证据。浏览器撤销状态和数据库修订也解决不同恢复问题。集成应围绕各层权威设计,不能让一次绘制成功、撤销条目或元数据标记代替全部验证。
实施步骤
- 1
追踪一个节点到其注册定义。
- 2
检查所选渲染器与脏节点处理。
- 3
使用已观察版本保存,并显式处理冲突。
- 4
区分本地元数据与公开发布。
可复制示例
{"layers":["场景图","注册表与渲染器","SQLite 修订"],"existingVersion":3,"writeExpectedVersion":3,"nextVersionIfAccepted":4,"publishedFlagMeansInternetDeployment":false}常见问题
expectedVersion 会合并并发编辑吗?
不会。它检测版本不匹配,让调用方重新读取、比较并决定如何处理。
published: true 表示项目已经上网了吗?
不能这样判断。该字段由所查本地存储返回,并不证明任何公开部署。
资料来源
- README.md来源核查 2026-09-08
- LICENSE来源核查 2026-09-08
- packages/cli/package.json来源核查 2026-09-08
- packages/core/package.json来源核查 2026-09-08
- packages/viewer/README.md来源核查 2026-09-08
- packages/cli/src/runtime.ts来源核查 2026-09-08
- packages/cli/src/editor-process.ts来源核查 2026-09-08
- packages/cli/src/mcp-connector.ts来源核查 2026-09-08
- packages/mcp/src/transports/http.ts来源核查 2026-09-08
- packages/mcp/src/storage/sqlite-scene-store.ts来源核查 2026-09-08
- packages/core/src/store/use-scene.ts来源核查 2026-09-08
- packages/viewer/src/components/renderers/node-renderer.tsx来源核查 2026-09-08
- packages/viewer/src/lib/renderer-capability.ts来源核查 2026-09-08
- packages/core/src/validation/validate-build-json.ts来源核查 2026-09-08
- packages/core/src/utils/heal-scene-graph.ts来源核查 2026-09-08
- packages/mcp/src/storage/slug.ts来源核查 2026-09-08