作者iLeyaSin365 (365)
看板heart
标题[闲聊] gemini 用比喻解释UE的blakç
时间Sat May 24 10:41:32 2025
最近在学习虚幻引擎Unreal engine 5人工智能模块,需要使用Btree blackboard,请问为什
麽要blackboard?能给我一个比喻增进了解吗?
使用 Unreal Engine 5 的 AI 模块时,`Blackboard`(黑板)是与 `Behavior Tree`(行
为树)协同工作的关键组件。它之所以重要,是因为它提供了一种集中且灵活的方式来储存
和管理 AI 代理(Agent)的资料。
### 为什麽需要 Blackboard?
想像一下,一个 AI 角色(例如游戏中的敌人或友方 NPC)需要做出各种决策。这些决策可
能基於:
* **当前状态:** 它受伤了吗?它看到玩家了吗?
* **目标:** 它要去哪里?它要攻击谁?
* **环境资讯:** 附近有没有掩体?有没有道具可以捡?
如果这些资讯分散在行为树的各个节点中,就会变得非常难以管理和协调。例如,一个行为
树节点负责「寻找玩家」,另一个节点负责「攻击玩家」,它们都需要知道「玩家的位置」
。如果没有一个共享的地方来储存这个资讯,每个节点都需要自己去获取,这会导致:
1. **重复的逻辑:** 每个节点都有一段代码来获取相同的资讯。
2. **难以修改和维护:** 如果玩家位置的获取方式改变了,你需要修改所有相关节点。
3. **行为树逻辑与资料耦合:** 行为树的节点应该专注於**做什麽**,而不是**知道什
麽**。
`Blackboard` 就像一个共享的记忆体区域,让行为树的各个节点可以读取和写入资讯,而
不需要直接互相沟通。这使得行为树的逻辑可以保持乾净和专注。
### 比喻:餐厅的服务生和厨师
让我给你一个比喻来增进了解:
想像你经营一家非常繁忙的餐厅,有:
* **服务生(Behavior Tree):** 他们负责处理顾客的点餐、上菜、结帐等等。他们有很
多不同的任务,而且会根据情况做出不同的决定。
* **厨师(AI 的不同行为逻辑,例如「寻路」、「攻击」):** 他们负责准备菜肴。
* **`Blackboard`(点菜单/订单墙):** 这是一块巨大的、所有人都看得到的白板,上面
写着:
* 桌号:5,顾客点了牛排(`目标:攻击玩家`)
* 桌号:3,顾客说不吃辣(`状态:玩家受伤`)
* 桌号:7,顾客要求加一瓶可乐(`环境资讯:发现道具`)
* 下一道菜是「红酒炖牛肉」(`目标:走向某个位置`)
**没有 `Blackboard` 的情况(传统硬编码):**
如果没有这块点菜单,服务生每次接到点餐,都必须直接跑到厨房,对着厨师喊:「3 号桌
要一份意面!」然後,当意面做好後,厨师又必须直接找到那个服务生说:4 「3 号桌的意
面好了!」
这会导致:
* **混乱:** 大量的服务生和厨师之间直接对话,非常吵杂。
* **效率低下:** 服务生需要不断跑到厨房,厨师也需要记住每个服务生负责哪张桌子。
* **难以扩展:** 如果增加了新的菜品或服务生,沟通会变得更加复杂。
**有了 `Blackboard` 的情况:**
现在,服务生只需要将顾客的点餐写在 `Blackboard` 上(例如:「3 号桌,意面」)。厨
师会不断地查看 `Blackboard`,一旦看到有新的订单,就开始制作。菜肴做好後,厨师也
会在 `Blackboard` 上标记「3 号桌意面已完成」。服务生看到标记後,就去取菜并上桌。
**对应到 AI 系统:**
* **服务生(Behavior Tree):** 它会不断地检查 `Blackboard` 上的资讯,根据这些资
讯决定接下来要执行哪个行为节点(例如,看到 `玩家位置` 资讯,就执行 `移动到玩家`
节点;看到 `玩家生命值低`,就执行 `寻找药水` 节点)。
* **厨师(AI 的不同行为逻辑):** 不同的行为逻辑会把他们需要分享的资讯写到 `Blac
kboard` 上。例如,「感知系统」发现了玩家,就会把「玩家位置」写到 `Blackboard` 上
。
* **`Blackboard`:** 储存了 AI 代理需要了解的各种资讯,例如:
* `玩家位置`(目标)
* `敌人生命值`(状态)
* `是否被发现`(状态)
* `最近的掩体位置`(环境资讯)
* `寻路目标点`(目标)
**总结来说,`Blackboard` 在 AI 系统中扮演的角色是:**
1. **集中储存:** 提供一个单一的、共享的资料储存位置。
2. **解耦:** 将行为树的逻辑(做什麽)与 AI 的状态和目标资料(知道什麽)分开,
使得行为树更简洁、可读性更高。
3. **灵活性:** 不同的行为树节点可以方便地读取和写入共享的资讯,即使它们位於行
为树的不同分支中。
4. **可扩展性:** 增加新的 AI 行为或资讯类型时,只需要修改 `Blackboard` 的结构
,而无需修改行为树的许多节点。
所以,`Blackboard` 就像一个 AI 角色的大脑,负责储存它需要了解的一切,而行为树则
像大脑中处理决策的逻辑单元,它会根据大脑中的资讯来做出行动。这让 AI 的行为设计变
得更加模组化和易於管理。
你这个类比非常棒,而且捕捉到了 `Blackboard` 的一个核心特性,但也有一些细微的差别
。
### `Blackboard` 与消息伫列的相似之处
你提到「消息伫列」中,消费者从中间获取生产者的消息,并且将生产者类比为黑板(或厨
师透过菜单墙沟通),这个理解是**部分正确且很有洞察力**的。
相似之处在於:
* **解耦(Decoupling):** 两者都实现了生产者和消费者之间的解耦。生产者(例如,A
I 的感知系统发现了玩家)不需要直接知道谁会使用这个资讯,它只需将资讯写入 `Blackb
oard`。消费者(行为树的某个节点)也不需要知道是谁生成了这个资讯,它只需要从 `Bla
ckboard` 读取。
* **集中式资讯储存:** `Blackboard` 就像一个消息伫列或资料库,提供一个中心点来储
存和访问数据。
### `Blackboard` 与消息伫列的差异
然而,`Blackboard` 和传统的「消息伫列」模式之间存在一些关键的差异,这也是为什麽
它被称为「黑板」而不是「消息伫列」:
1. **持久性与状态:**
* **消息伫列:** 消息通常是**暂时的**,一旦被消费者处理,通常就会从伫列中移
除。它更侧重於「事件流」或「任务分发」。
* **`Blackboard`:** 储存的是 AI 的**当前状态和目标**,这些资讯通常是**持久
的**,直到被明确修改或删除。它更像是一个共享的「记忆体」或「资料库」,反映了 AI
当下的「心智状态」。厨师在菜单墙上写下「红酒炖牛肉」并不是一个即时消息,而是「这
道菜需要制作」的**状态**,直到它被完成。
2. **拉取模型与推送模型:**
* **消息伫列:** 虽然有时可以是拉取,但许多消息伫列也支援「推送」模型,即消
息到达时通知消费者。
* **`Blackboard`:** 主要是一个**拉取模型**。行为树的节点会**主动去查询** `B
lackboard` 上的资讯,而不是被动地等待消息被推送到它们。例如,行为树的「攻击节点
」会主动去 `Blackboard` 上查询「玩家位置」这个键,而不是等待「玩家位置」这个消息
被推送过来。
3. **语义差异:**
* **消息伫列:** 更侧重於「事件」和「命令」。例如:「玩家被发现了!」或「开
始攻击!」。
* **`Blackboard`:** 更侧重於「事实」和「状态」。例如:「玩家当前位於 (X, Y,
Z)」、「AI 的生命值是 50」、「下一个路径点是 A」。
---
### 总结
所以,你的比喻非常贴切地解释了**解耦**和**集中式资讯共享**的核心概念。
`Blackboard` 更像是一个**共享的「资料库」或「事实储存库」**,它包含着 AI 代理「
知道什麽」的所有当前资讯。行为树则根据这些「事实」来决定「做什麽」。
厨师在菜单墙上写下的「红酒炖牛肉」这个资讯,的确类似於 `Blackboard` 上的一个「键
值对」,它代表了一个「待办事项」或「目标状态」,而不是一个会立即消失的「事件」。
因此,你可以这样理解:
* **消息伫列**更像是餐厅里传递的「口头消息」或「小纸条」,一旦传达,信息就完成其
使命。
* **`Blackboard`**更像是餐厅墙上那张**持续更新的「订单总览板」**,上面记录了所有
桌子的当前状态、待处理任务和已完成的项目,所有人都随时可以去查看。
这样想,是不是能更清楚地理解两者之间的细微差别了呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.82.133.253 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/heart/M.1748054494.A.6DD.html