第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 数据结构关系图

下图展示了一个典型场景地图的节点树结构,并标注各节点的类型与有效优先级:

场景地图节点树 & 优先级关系 ROOT 城市 effPri=200 REGION 中心区 effPri=75 REGION 郊区 effPri=80 POI 信号塔 effPri=32 POI 地铁站 effPri=28 LINK 高速路 effPri=7 DECOR 路灯 effPri=0 有效优先级 = base_priority + dynamic_offset 排序时以 effPri 降序,相同则按节点 ID 字典序

1.5 调试与验证建议

在开发阶段,建议实现以下调试能力:

  • 优先级快照输出:每帧或每次排序后,将节点 ID 与 effective_priority 导出为 CSV,用于对比预期行为。
  • 越界检测:若 dynamic_offset 导致 effective_priority 超出类型区间,应记录警告并钳位到边界值。
常见错误:忘记在反序列化后调用 recalculate_priority() 会导致排序使用旧值,表现为节点顺序错乱或性能下降。建议在节点管理器初始化时统一触发一次全量计算。