做者:alexjc正則表達式
譯者:賴勇浩(戀花蝶)算法
原文地址:http://aigamedev.com/questions/fsm-age-is-over編程
本文最初發表於戀花蝶的博客(http://blog.csdn.net/lanphaday),如蒙轉載,敬請保留全文完整,包括本聲明。安全
通過幾個月的發展, AiGameDev.com 造成了一個小有氣候的社區,謝謝你們支持!每一個週五,我將抽出時間來回答你們的問題,你能夠在 blog 和論壇 上提問。併發
有限狀態機在過去十年裏變得很是流行,遊戲開發者用它開發了不少極具趣味的遊戲。但再好的事情也有個結束,是否到了使用比 FSM 更好的技術來完成 AI 邏輯的時代了?編程語言
本週的問題是一個評論,erm@duh.org提出了一個與週三的教程系列有關的有趣話題,讓我把它改得更有建設性一些:模塊化
「據我所知不少領域(如遊戲業界)都使用有限狀態機來實現遊戲 AI。爲何你不用它來實現這個模擬遊戲裏的狗的行爲?」工具
這個教程使用行爲樹來體現它與狀態機的不一樣,並且遊戲 AI 開發者也可以從中獲得分級邏輯的好處。spa
固然咱們也能夠用有限狀態機(FSM)來構建相同的行爲。但業內人士都知道這一技術在邏輯增加時有多麼有脆弱。遠離 FSM 是避免遊戲項目變得一塌糊塗的選擇!.net
非正統
問題: 構建 FSM 的方式對於不一樣的軟件工程師而言是徹底不一樣的流程。是的,概念上它是「設計師友好」的,但實際上應用 FSM 須要應用很是多的編程知識和細節。
緣由: FSM 要求每個狀態明確地轉換到另外一狀態。沒有一個編程語言須要這樣,語言自己的語義就隱含了全部轉換(如C++編譯器從語句構造執行指令序列)。
過於底層
問題: 編輯FSM的邏輯很是底層,並且機械性十足。咱們經常會發現本身老是在構建類似的行爲,並且這會花費咱們大部分時間。
緣由: 咱們所能作的僅是編輯從一狀態到另外一狀態的轉換,而沒法作出更高層次的模式致使頻繁重複類似的序列或條件。有限狀態機的世界不存在元編程(Meta-programming)。
邏輯受限
問題: 有限狀態機形式固定,從而致使計算受限(又稱爲非圖靈完備)。這意味着咱們不能像計數同樣作事。
緣由: 若是咱們把事件看成符號,咱們只能用有限狀態自動機識別正則文法,這一方法下一個正則表達式不能識別某些類別的文本模式。一樣,有限狀態機僅能做爲正則語言的傳感器。
須要自定義擴展
問題: 遊戲開發者在實踐中常常須要擴展 FSM 才能將其用於項目,然而這並不容易被理解,甚至還缺少文檔。這是與FSM的學術基礎並不相同。
緣由: 由於 FSM 受限於理論,開發者必須自行增長功能擴展以實現肯定的某些特性。這意味着要用編程語言去實現計數器、計時器和任何形式的內存對象。
難以標準化
問題: 不像規劃器(HTN)或搜索算法(A*),它們能用相關的通用方法實現。而 FSM 則很是難以在不一樣的遊戲間重用,甚至在引擎是不一樣的部分重用也不可能。
緣由: 由於 FSM 是非圖靈完備的, FSM 須要爲每一問題自定義特定的解決方案。這使得它們適用度極低,而不像腳本語言同樣可以很容易地從新打包。
非自主的
問題: 使用 FSM 實現目標導向的行爲須要作不少工做。這是一個大問題,由於大部分有針對性的AI 須要處理長遠目標。
緣由: FSM 運做於反應模式,只能處理事件和觸發跳轉。它們沒法自動向前(又稱爲自主),所以咱們必須爲全部不一樣的目標手動轉換。
難以併發
問題: FSM 難以併發。當並行運行多個狀態機,要麼死鎖,要麼咱們經過手工編輯來確保它們在某個程度上可以兼容。
緣由: FSM 存儲的信息越多在處理外部資源衝突上的問題就越多。使狀態機併發的解決方案一般是擴展 FSM 自身,把它做爲支持邏輯或一套工具來保證併發安全。
大規模支持較差
問題: 有限狀態機,甚至是分層的,也難以大規模擴展。它們每每是在其中夾雜一大塊邏輯代碼,而非行爲編輯模塊化。
緣由: FSM 並不利用編程語言提供的用以解決大問題的規模化特性,一樣地FSM 也難以同步多個行爲模塊。
勞動密集型
問題: 用 FSM 實現任何設計都須要作大量工做。甚至狀態機自己也有着無數問題。
緣由: 如前所述,應對全部挑戰須要花費設計師的大量時間,甚至最終這還會成行爲中的 bugs 的來源!
行業進步
事實: 許多資深遊戲開發者已經再也不使用有限狀態機,而是使用行爲樹之類的可替換方案。
事實: 如今多個遊戲 AI 中間件提供商致力於規劃器實現的 AI,在 2008 年將會見到更多可用的此類產品。
結論
FSM,就像其它技術同樣,在遊戲開發的進程中佔有了應得的一席之地。然而,開發者默認使用有限狀態機來實現 AI 的時代,已經行將結束。帶有協程的腳本在今天已經極其流行,而分級規劃器將愈來愈多地應用在遊戲及其中間件。
有問題不明白?請教Google大神吧!