黑板:感知、决策、执行共用的一块记忆
Blackboard Architecture
站起来,推开椅子,再倒下
一个 NPC 正坐在桌边,被你一枪打中。它应该就地瘫倒——可在《No One Lives Forever 2》那一代的做法里,它可能先站起来、推开椅子,然后才倒下。
问题出在哪?那时每个目标 (Goal) 都是一个黑盒,各自把状态藏在自己身上,互相不共享姿势这类信息。比如「坐着」只记在负责坐下的那个目标里,接手的「死亡」目标并不知道角色现在是坐着的。Jeff Orkin 在讲 F.E.A.R. 时总结说:目标和行动解耦以后,必须有一块外部的共享工作区,用来表达「是否坐着」「是否在和桌子交互」这些事实,死亡的姿态才能正确。
这块共享工作区,就是黑板 (Blackboard)。
黑板上写些什么
黑板是多个模块共享的「工作记忆」:感知写入,决策读取,任务执行时回头更新。各个子系统不用私有状态互相耦合,只通过这块表交换事实。《游戏引擎架构》(GEA) 把「某种记忆或知识」和寻路、感知并列,算作 AI 最底层的三件套之一。
| 类别 | 例子 |
|---|---|
| 感知结果 | 当前敌人、上次看见的位置、噪声位置 |
| 决策的中间量 | 选定的掩体、环境查询找到的最佳点、当前目标的优先级 |
| 执行的反馈 | 路径是否失败、是否正在装弹、命令是谁下的 |
一次典型的读写往来是这样的:
sequenceDiagram participant S as 感知 participant B as 黑板 participant D as 行为树 participant T as 移动任务 S->>B: 写入 当前敌人、上次看见的位置 D->>B: 读取 当前敌人 D->>T: 启动:移动到上次看见的位置 T->>B: 写入 路径失败 D->>B: 读取 路径失败 D->>T: 改为:原地搜索
感知和任务都不知道行为树的存在,行为树也不直接去问感知系统——大家只认黑板上的键。
行为树里的黑板:数据上下文
Chris Simpson 讲行为树时,给每个树实例配了一块数据上下文 (Data Context):一张「字符串键 → 任意值」的表。前面的节点把目标点写进 destination,后面的 Walk 叶子读出来去走;调用子树的叶子把同一块上下文传下去,子树就能像模块一样复用。这就是树内的黑板。
虚幻引擎把黑板做成了独立的资产,每个键的类型是固定的。行为树的装饰器、服务和任务都通过黑板的键来通信,感知组件的回调也常常直接去写这些键。
Halo 2 的 Props:按对象存的信念
Damian Isla 给 Halo 2 的 AI 记忆分了几类:
- 行为的短时状态;
- 行为的持久状态,比如冷却时间;
- 按对象存的感知信念:对每个目标,「我以为它在哪」;
- 按对象、按行为存的记录,比如「这个目标我已经搜过了」。
后两类就是 Props。它存的是 AI 以为的世界,可以和真实世界不一致——目标已经走开了,AI 还记得旧位置,于是它可以被骗、会惊讶、会去搜一个已经没人的地方。
此外,Halo 2 的行为树本身是静态的、所有角色共用;每个角色只为当前激活的那条路径分配短时状态。这比一张扁平的全局字典多了一层「按对象索引」的知识模型,但核心思想仍然是共享记忆。
拉与推:黑板和事件
黑板是拉模型:谁需要,谁就去读最新的值。事件是推模型:发生了什么,主动通知订阅的人。
在游戏里怎么用
取舍与常见的坑
小结与练习
- 黑板是 AI 各模块共享的工作记忆:感知写、决策读、任务回头更新;
- 它解决的是「目标各藏各的状态」带来的问题,比如站起来推开椅子再倒下;
- 行为树的数据上下文、虚幻引擎的黑板资产、Halo 2 的 Props,都是同一思想的变体;
- 黑板是拉模型,事件是推模型,常见做法是事件写黑板、决策读黑板。
练习:为一个会「听到声音就去查看」的守卫设计黑板:需要哪些键?哪些是感知写的,哪些是任务写的?「听到的噪声位置」过多久应该失效,由谁来清掉它?
黑板 (Blackboard) 是多模块共享的「工作记忆」:感知写入、决策读取、任务更新键值,避免各子系统用私有状态互相耦合。行为树的 Data Context、GOAP 的 Working Memory、Halo 的 Props,都是同一思想的变体。
要解决的问题
若每个 Goal / 行为自己藏状态,换目标时容易「站起来推椅子再倒下」(NOLF2 式黑盒目标互不共享姿势信息)。Orkin 指出:解耦目标与行动后,必须有一块 外部共享工作区 表达「是否坐下、是否与桌子交互」等,死亡姿态才能正确。(Three States and a Plan: The A.I. of F.E.A.R.(笔记))
典型内容
| 类别 | 例子 |
|---|---|
| 感知结果 | 当前敌人 Actor、上次看见的位置、噪声位置 |
| 决策中间量 | 选定掩体、EQS 最佳点、当前目标优先级 |
| 执行反馈 | 路径是否失败、装弹中、命令来源 |
GEA 把「某种记忆或知识」列为 AI 底层三件套之一。(GEA4 Vol II §18.2.3 Artificial Intelligence(摘录笔记))
与行为树
Simpson 的 Data Context(字符串键 → 任意值)即树内黑板:前序节点写入 destination,后续 Walk 读取;子树共享同一上下文以实现模块化。(Behavior trees for AI: How they work(笔记))
UE 把黑板做成独立资产,键类型固定,行为树装饰器/服务/任务通过键通信;感知回调常直接写键。(Behavior Tree Overview;实现细节见 行为树与 StateTree)
Halo 的 Props:带信念的对象记忆
Isla 区分:行为短时状态、持久行为冷却、per-object 感知信念、per-object per-behavior 记录。Props 存「我以为目标在哪」,可与真实世界偏离 → 可被骗、惊讶;也挂「是否已搜过该目标」等。(Handling Complexity in the Halo 2 AI(笔记))
这比「扁平全局字典」多了 对象索引的知识模型,但仍是共享记忆思想。
取舍
- 优点:感知/决策/执行解耦;调试时可盯一块表;多行为复用同一事实。
- 坑:键爆炸与命名混乱;任何人都可写导致竞态;把「瞬时脉冲」和「长期信念」混在同一表会难调。Isla 强调少让行为持有大块持久状态。(Handling Complexity in the Halo 2 AI(笔记))
- 与消息:黑板是拉模型(读最新值);事件是推模型。大系统常两者并用——事件写黑板,决策每拍读黑板。见 事件与消息传递。
出处
- GEA4 Vol II §18.2.3 Artificial Intelligence(摘录笔记) GEA4 §18.2.3(记忆/知识层)
- Handling Complexity in the Halo 2 AI(笔记) Isla Halo 2 Props / 记忆分类
- Three States and a Plan: The A.I. of F.E.A.R.(笔记) Orkin Working Memory / 解耦目标与行动
- Behavior trees for AI: How they work(笔记) Simpson Data Context
- Behavior Tree Overview UE 5.8 Behavior Tree / Blackboard