1. 数据对象分层#
静态 Definition 描述“是什么”,Runtime Entity 描述“现在怎样”,Player Profile 描述“玩家累计了什么”。三者不混存。资料片和功能卡片只提供定义,不直接保存玩家状态。
2. 高性能存储布局#
EntityId[]
DefinitionId[]
ChunkId[]
State[]
Flags[]
Position[]
Progress[]
StorageOffset[]
StorageLength[]
SparseComponentIndex高频字段使用连续数组或 C++ 紧凑结构;低频字段使用稀疏组件。避免每个实体一个 Dictionary,避免把所有字段都变体化。
3. 稳定句柄#
EntityId 由 slot index 和 generation 组成。删除实体只回收 slot 并递增 generation;任何旧句柄访问前都要校验 generation。DefinitionId 永不因删除内容而复用。
4. 空间与 Chunk#
空间统一使用 1m 整数网格;默认楼格为 1m 宽、4m 高,自由楼格为 1m³ 单元。楼格、房间、柱、墙、梁、核心筒和结构报告按 Chunk 分组,UI 只查询可见窗口,不为每个格创建 Godot Node。结构检查由命令触发并生成带 revision 的只读报告。
空间统一使用 1m 整数网格;默认楼格为 1m 宽、4m 高,自由楼格为 1m³ 单元。楼格、房间、柱、墙、梁、核心筒和结构报告按 Chunk 分组,UI 只查询可见窗口,不为每个格创建 Godot Node。结构检查由命令触发并生成带 revision 的只读报告。
世界坐标使用整数格或明确的固定点表示;渲染坐标转换只发生在表现层。实体按 Chunk 分组,Chunk 有自己的 dirty flags、revision、统计摘要和保存块。跨 Chunk 的生产和物流使用边界端口,不扫描全世界。
5. 生产、物流和资源#
| 对象 | 核心字段 | 更新方式 |
|---|---|---|
| 资源 | definition_id、数量、质量、来源 | 变化事件驱动 |
| 配方 | inputs、outputs、duration、conditions | 队列批处理 |
| 设施 | definition_id、状态、库存端口、功率 | 短周期或脏标记 |
| 物流 | from、to、capacity、in_transit | 分批运输 |
| 产业链 | 节点、边、缺口、瓶颈 | 拓扑和增量更新 |
6. 查询模型#
UI 不读取权威数组。QueryService 根据筛选、分页、排序生成只读 DTO;大列表必须虚拟化。查询结果带 world_revision,界面发现 revision 落后时重新拉取。
7. 数据验收#
每个对象都必须有定义、来源、解锁条件、输入和输出边界。不可达配方、悬空引用、重复 ID、负库存和非法状态属于编译错误或运行时断言。