`
javayestome
  • 浏览: 1010581 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

有限状态机时代终结的10大理由

阅读更多

有限状态机时代终结的10大理由

作者:alexjc

译者:赖勇浩(恋花蝶)

原文地址:http://aigamedev.com/questions/fsm-age-is-over

本文最初发表于恋花蝶的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,包括本声明。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="width: 2in; height: 78pt;" o:button="t" alt="" type="#_x0000_t75"><imagedata o:href="http://files.aigamedev.com/QUESTIONS.png" src="file:///C:%5CDOCUME~1%5CLai%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.gif"></imagedata></shape>

经过几个月的发展, AiGameDev.com 形成了一个小有气候的社区,谢谢大家支持!每个周五,我将抽出时间来回答大家的问题,你可以在 blog 论坛 上提问。

有限状态机在过去十年里变得非常流行,游戏开发者用它开发了很多极具趣味的游戏。但再好的事情也有个结束,是否到了使用比 FSM 更好的技术来完成 AI 逻辑的时代了?

本周的问题是一个评论,erm@duh.org提出了一个与周三的教程系列有关的有趣话题,让我把它改得更有建设性一些:

“据我所知很多领域(如游戏业界)都使用有限状态机来实现游戏 AI。为什么你不用它来实现这个模拟游戏里的狗的行为?”

这个教程使用行为树来体现它与状态机的不同,而且游戏 AI 开发者也能够从中得到分级逻辑的好处。

当然我们也可以用有限状态机(FSM)来构建相同的行为。但业内人士都知道这一技术在逻辑增长时有多么有脆弱。远离 FSM 是避免游戏项目变得一塌糊涂的选择!

非正统

问题: 构建 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 的时代,已经行将结束。带有协程的脚本在今天已经极其流行,而分级规划器将越来越多地应用在游戏及其中间件。

<!-- SiteSearch Google --> 有问题不明白?请教Google大神吧!
Google 输入您的搜索字词 提交搜索表单
Web blog.csdn.net
<!-- SiteSearch Google -->
分享到:
评论

相关推荐

    verilog有限状态机实验报告(附源代码).pdf

    verilog有限状态机实验报告(附源代码).pdfverilog有限状态机实验报告(附源代码).pdfverilog有限状态机实验报告(附源代码).pdfverilog有限状态机实验报告(附源代码).pdfverilog有限状态机实验报告(附源代码)....

    VHDL——有限状态机

    有限状态机有限状态机有限状态机有限状态机有限状态机有限状态机

    有限状态机编程

    有限状态机C语言编程有限状态机C语言编程有限状态机C语言编程

    用有限状态机进行软件设计

    用有限状态机进行软件设计用有限状态机进行软件设计用有限状态机进行软件设计用有限状态机进行软件设计用有限状态机进行软件设计用有限状态机进行软件设计

    有限状态机 FSM

    只有 2 个时钟周期 约数十个 ns 尚不足以对系统的运行构成损害 而 CPU 通过复位方第 10 章 有限状态机 FSM 199 式从非法运行方式中恢复过来 耗时达数十 ms 这对于高速高可靠系统显然是无法容忍 的 再其次是状态机...

    有限状态机VHDL模板

    有限状态机VHDL模板 FPGA开发实用模板

    C语言高效有限状态机(FSM)详细设计说明书.docx

    有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、...

    Python有限状态机——transitions

    Python有限状态机——transitions https://xercis.blog.csdn.net/article/details/124127799

    fsm_keil_version3_keil有限状态机_fsm打开_8051实现状态机_

    在8051单片机内实现列表型的状态机。如果你需要更多的状态转移,你只需要将任务函数加入到列表里面即可。里面还附带了电路图

    C++实现的分层有限状态机v0.1

    C++实现的分层有限状态机v0.1 使用帮助:http://blog.csdn.net/vvsxr/article/details/40302677

    用有限状态机思想实现矩阵按键扫描

    用有限状态机思想实现矩阵按键扫描,初学者做实验可参考,写的很好,51单片机矩阵按键控制实验51单片机矩阵按键控制实验51单片机矩阵按键控制实验

    用C语言实现有限状态机

    用C语言实现有限状态机用C语言实现有限状态机用C语言实现有限状态机

    java实现有限状态机

    用java语言实现有限状态机,这个简单地实例能全面地诠释状态机的思想

    如何使用有限状态机及其应用

    有限状态机,在大型程序里面,用状态机的方法会狠方遍,,,

    有限状态机FSM

    Unity C# 《有限状态机》的用法教程详解Demo 助力快速理解 FSM 有限状态机,完成游戏状态的切换 教程地址:https://blog.csdn.net/ChinarCSDN/article/details/82263126

    有限状态机(FSM)的设计与实现

    有限状态机(FSM)是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。通常FSM包含几个要素:状态的管理、状态的监控、状态的触发、状态触发后引发的动作。本文主要阐述...

    TCP有限状态机

    TCP有限状态机,有图和文字,有网络上的资源进行编辑得到,绝对好用

    JavaScript有限状态机

    JavaScript版本的有限状态机的实现适用于多状态流程运转设计模块使用,只需要配置就可以直接使用

    有限状态机 状态机

    单片机 状态机 有限状态机 单片机 状态机 有限状态机

    有限状态机设计策略

    有限状态机设计策略,很好地学习资料,你值得一看!

Global site tag (gtag.js) - Google Analytics