看板heart
最近在學習虛幻引擎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`**更像是餐廳牆上那張**持續更新的「訂單總覽板」**,上面記錄了所有
桌子的當前狀態、待處理任務和已完成的項目,所有人都隨時可以去查看。
這樣想,是不是能更清楚地理解兩者之間的細微差別了呢?
--※ 文章網址: https://www.ptt.cc/bbs/heart/M.1748054494.A.6DD.html