第1章 场景地图节点数据结构与优先级定义
场景地图是游戏、自动驾驶、AR/VR 等系统中对空间环境的抽象表示。每个地图由若干节点(Node)组成,节点类型决定了其行为,优先级(Priority)则控制遍历、渲染、事件响应的先后顺序。本章定义标准节点数据结构与优先级字段,为后续章节的排序算法、性能优化打下基础。
1.1 节点类型体系
根据功能与生命周期,节点划分为以下五类,每类绑定独立的优先级取值区间与数据结构字段:
| 类型 | 标识 | 语义 | 优先级默认范围 |
|---|---|---|---|
| 根节点 | ROOT |
场景入口,管理子节点生命周期 | [100, 255] |
| 区域节点 | REGION |
划分物理或逻辑区域,如房间、街区 | [50, 99] |
| 兴趣点节点 | POI |
关键标记,如商店、交通灯、任务目标 | [10, 49] |
| 连接节点 | LINK |
记录路径、传送门、通信链路 | [1, 9] |
| 装饰节点 | DECOR |
视觉或碰撞非交互元素,如树、道具 | [0, 0] |
设计原则:优先级值越高的节点在遍历中越早被处理,根节点始终拥有最高调度权。DECOR 节点固定为 0,表示不需要主动排序优化。
1.2 优先级字段定义
节点数据模型中包含三个与优先级直接相关的字段:
base_priority(基本优先级,类型 int,不可为空)——由节点类型推导的静态基准值。dynamic_offset(动态偏移,类型 int8,默认 0)——运行时根据状态(如玩家距离、帧率、负载)微调的增量。effective_priority(有效优先级,类型 int,只读)——实时计算值,等于base_priority + dynamic_offset,作为排序键使用。
1.3 完整数据模型(JSON Schema 示例)
以下配置片段展示了节点在 JSON 中的标准表示,可直接用于编辑器导入或运行时序列化:
{
"node_id": "root_city_01",
"type": "ROOT",
"base_priority": 200,
"dynamic_offset": 0,
"children": [
{
"node_id": "region_downtown",
"type": "REGION",
"base_priority": 80,
"dynamic_offset": -5,
"bounds": {
"x": 0, "y": 0, "width": 100, "height": 100
},
"children": [
{
"node_id": "poi_tower",
"type": "POI",
"base_priority": 30,
"dynamic_offset": 2
}
]
}
]
}
实现要点:序列化时保证
effective_priority 不写入存储;反序列化后必须重新计算,避免陈旧数据影响排序。
1.4 数据结构关系图
下图展示了一个典型场景地图的节点树结构,并标注各节点的类型与有效优先级:
1.5 调试与验证建议
在开发阶段,建议实现以下调试能力:
- 优先级快照输出:每帧或每次排序后,将节点 ID 与 effective_priority 导出为 CSV,用于对比预期行为。
- 越界检测:若 dynamic_offset 导致 effective_priority 超出类型区间,应记录警告并钳位到边界值。
常见错误:忘记在反序列化后调用
recalculate_priority() 会导致排序使用旧值,表现为节点顺序错乱或性能下降。建议在节点管理器初始化时统一触发一次全量计算。