Elden Ring 的低科技 AI:状态机凭什么打赢了深度学习

Elden Ring 的低科技 AI:状态机凭什么打赢了深度学习

elden-ringgame-aifromsoftwarebehavior-treefsm

数据源:nega.tv + Lobsters + HN

Margit the Fell Omen 举起手杖,在空中停顿了一秒半。

你已经在翻滚了。你的拇指抢在意识之前按下了 B 键,因为前面八次死亡教会了你一件事:Margit 的起手动作里藏着两套完全不同的连招,区别只在杖尖的晃动幅度上。但这一次你没有来得及分辨——你在看到杖尖之前就翻了。Margit 的延迟斩精准地落在你翻滚无敌帧结束的那一帧。YOU DIED。

第九次。你盯着屏幕,开始注意到一件诡异的事:你死得越多,Margit 的行为反而变得越来越「可读」。不是因为它变弱了——每次死亡后 Boss 的数据没有任何变化——而是你的大脑正在把 Margit 的动作库编译成一套规则:杖尖前倾 = 突进三连;杖尖上挑 = 圣锤砸地;距离超过一个身位 = 飞刀投掷。这些规则不多,每一条都清晰可辨,每一条都对应一个确定的响应窗口。

这就是 FromSoftware 游戏 AI 最反直觉的地方:它越简单,你越觉得它聪明。

不是 AI,是 PDA

2026 年 6 月,一篇发布在 nega.tv 上的技术逆向文章炸穿了 Hacker News 和 Lobsters。文章的内容可以概括为一个令人意外的发现:FromSoftware 的敌人 AI 系统——从《恶魔之魂》一路用到《艾尔登法环》——底层不是行为树(Behavior Tree),不是 GOAP 规划器,更和深度学习没有半分钱关系。它本质上是一个下推自动机(Pushdown Automaton,PDA),用 Havok Script(一个已停产的、面向游戏的 Lua 变体)编写,数据结构比绝大部分 AAA 游戏的 AI 系统都简陋。

FromSoftware 内部称其 AI 的基本单元为「Goal」。一个 Goal 就是一个不可变的函数表,包含三个核心回调:activate(首次执行或子目标耗尽后重新激活)、update(每帧调用,返回 Continue/Success/Failure)、interrupt(响应外部事件)。每个 Actor(即游戏中的 NPC 或 Boss)维护一个 Goal 栈——不是简单的有限状态机,而是一个带栈结构的 PDA。

运行时逻辑极其朴素:每帧更新栈顶 Goal。如果当前 Goal 需要展开子行为,它往栈上推一摞 Sub-Goal,下一帧自动开始执行最上面那个。Goal 完成时从栈里弹出;如果某个 Goal 失败了,整个子目标链一起出栈,控制权回到父 Goal 手里。

拿 CoolBossBattle 举个例子。Boss 的 activate 函数里有一组带权重的动作候选:远距离时,死亡射线权重 15、跳跃攻击权重 65;中距离时,地面猛击权重 5、轻击连段权重 60、重击连段权重 35。权重是动态的——冷却时间未到的招式权重被直接清零,Boss 血量越低,某些高危招式的权重越高。每轮决策就是做一次加权随机选择,然后把对应的攻击 Goal 推上栈。

这里没有「规划」。Boss 不会预判你三秒后站在哪里,不会构建世界模型,不会做蒙特卡洛树搜索。它只是在每个决策周期里,根据几个明确定义的条件(距离、冷却、血量、随机数)从动作表里抽一张牌。

但为什么它这么难打

这正是 FromSoftware 设计哲学最核心的悖论:让敌人行为可预测,反而让战斗更难。

一个常见的误解是「难 = 聪明」。但如果你回想一下真正让你摔手柄的游戏时刻,你会发现那些最令人沮丧的死亡通常不是因为敌人太聪明——是因为你看不懂敌人在干什么。当 NPC 的行为看起来随机、不一致、或者似乎「赖皮」时,玩家会从「我需要提高」瞬间切换到「这游戏在搞我」。学习过程终止。挫败感接管一切。

FromSoftware 的做法是反过来的。每个 Boss 的动作库是封闭的。每招的起手动画、攻击判定帧、收招硬直都是固定的。Boss 不会「学习」你的打法——它只是一遍又一遍地从同一个加权随机池里出招。但这恰恰意味着你能学习 Boss。第九次死亡和第一次死亡的区别,不是 Boss 变弱了,是你的大脑完成了一次对确定性系统的逆向工程。

Lobsters 用户 icefox 在评论里说了一句大实话:「比敌人 AI 聪明,是你在《艾尔登法环》里为数不多的优势之一。」这句话反过来读更准确:FromSoftware 把 AI 设计成能被玩家「智取」的东西,才是这个系列战斗体验成立的前提。

这套设计哲学的工程表述是:可预测性 = 可玩性。涌现行为不来自复杂的决策算法,而来自简单规则在不同玩家行为下的组合爆炸。延迟斩之所以经典,不是因为它用了什么高级 AI——只是在 Attack Goal 的动画播放中插入了一段额外的等待帧。但从玩家的视角看,这句话翻译过来是:「你需要学会数帧。」

为什么 AAA 游戏追 ML AI 反而翻车

把 FromSoftware 这套东西放到当下 AAA 游戏的 AI 趋势里看,反差大到有点好笑。

过去十年,游戏行业对 AI 叙事的主旋律是「让 NPC 更聪明」。Behavior Tree 成了事实标准——Halo 2 在 2004 年首次大规模使用 BT 管理战斗 AI,此后的 Halo 系列将 BT 做到了极致。GOAP(Goal Oriented Action Planning)因为 2005 年《F.E.A.R.》里那些会包抄、会翻掩体、会喊「他在换弹夹」的敌人而被神化至今。Utility AI 在《模拟人生》里证明了它能驱动复杂的日常生活模拟。每套方案都比 FromSoftware 的 PDA 复杂——BT 有序列节点、选择节点、并行节点、装饰节点,GOAP 需要 A* 搜索动作空间,Utility AI 要给每个选项打分。

但复杂性有一个被低估的代价:失控。 设计师越依赖通用规划器自动拼接行为序列,就越难预测 NPC 在特定情况下会做什么。GOAP 的经典问题就是「规划器偶尔决定用梯子砸门而不是开门」。Behavior Tree 的扩展通常伴随着「树深到没人看得懂」的诅咒,十几年前 Bungie 的 Damian Isla 在 GDC 演讲里就警告过:Halo 3 的 BT 复杂度已经达到了让设计师无法完全理解行为因果链的程度。

对 FromSoftware 来说,这不是问题——因为他们根本不给 AI「自我规划」的能力。每个 Boss 的行为是设计师逐帧编排的。动画师决定攻击的前摇帧数和判定帧数。战斗设计师决定冷却时间和权重分布。玩家感受到的「聪明」来自这三层手工打磨叠加后的涌现效应,而不是来自某个算法自作主张。

这是工程哲学的分界线。一边是「给 AI 一套通用智能框架,让它自己决定怎么做」,另一边是「给设计师一套足够简单、足够可组合的基础设施,让他们手工控制 AI 的每一个决策」。FromSoftware 赌的是后者,而且赌赢了。

中断系统:隐藏的难度调节器

除了 Goal 栈和加权随机选择,FromSoftware 的 AI 系统还有第三条腿:中断(Interrupt)。

每个 Goal 可以注册中断回调。当特定事件发生时——玩家使用了道具、释放了法术、站在了 Boss 背后的特定空间区域——中断事件沿着 Goal 栈向上冒泡,直到某个 Goal 的 interrupt 回调返回 true 表示「我处理了这个事件」。处理逻辑可以包括:清空当前 Goal 栈、立即推入新的攻击 Goal、或者修改父 Goal 的状态。

这就是为什么铃珠猎人(Bell Bearing Hunter)在你喝药瓶的时候几乎必定冲锋——它的中断系统里写了一条:检测到 UseItem 事件 + 85% 概率 → 清空当前动作、立即突进。你以为是 Boss 在「读指令」,其实它只是在响应一个硬编码的事件回调。

这个系统的聪明之处在于:它让设计师可以精确控制 Boss 对玩家行为的反应强度,而不需要把这个逻辑搅进基础决策循环里。Boss 的日常行为(中距离 → 随机从招式表抽卡)和应激行为(你在喝血瓶 → 立刻打断你)是两套独立的逻辑通道。

HN 评论区有人问:这套系统能不能处理比 Soulsborne Boss 战更复杂的场景?nega.tv 作者的回答是「可以走得很远」。理由很简单:PDA 框架的复杂度和 Goal 的数量与质量有关,与框架本身无关。想做一个村庄里每个 NPC 都有日常作息、社交网络的开放世界?你可能需要上千个 Goal 和复杂的编排系统。但想做一个令人难忘的 Boss 战?十几个 Goal、两百行 Havok Script 就够了。

返璞归真:低科技为什么赢了

回到开头那个问题:为什么 FromSoftware 的状态机比大多数 AAA 游戏的 AI 更好?

答案不在技术里,在设计哲学里。FromSoftware 从来没有把 AI 当作「模拟智能」的工具来开发——他们把 AI 当作战斗设计的传达媒介。Boss 的行为是设计师写给玩家的语言,每一招、每一个硬直窗口、每一个「你可以贪一刀」的暗示,都是有意为之。当 AI 变得太复杂、太不可预测时,这种语言就断裂了。玩家不再是「学习战斗」,而是「硬抗随机数」。

还有一些更实际的工程优势。PDA 的执行效率远高于 BT——它每帧通常只需要更新栈顶一个 Goal,而不需要从根节点重新遍历整棵树。FromSoftware 的 Goal 系统把控制流写在命令式代码里,数据模型极度精简——每个 Actor 上就是一个浮点数组,Goal 按索引读写。没有 Blackboard、没有事件总线、没有复杂的条件/序列/选择器节点树。作者在文章更新中特别强调:在大多数 AAA 游戏里,你可能会看到「数万个节点的行为树,加上数百个实现控制流和动作的独立节点」,而 FromSoftware 的单个 Boss 行为通常「相当小」。

当然,这不意味着 PDA 是没有代价的万灵药。用 Havok Script 写 AI 意味着基本告别了可视化行为编辑工具——设计师得写代码。中断系统的调试难度也会随着 Goal 栈深度指数级增长。没有通用规划器意味着每个 Boss 的行为都是手工定制的,没法复用——但这对 FromSoftware 来说不是 bug,是 feature。

一项技术选择的正确性,最终不取决于它有多先进,而取决于它是否匹配要解决的问题。FromSoftware 要解决的问题不是「做更聪明的 AI」,而是「做更可读、更可学、更公平的敌人」。用 PDA 而不是 GOAP,用状态机而不是深度学习,不是因为他们落后——是因为他们要的东西,恰好是低科技能给的东西。

本文的素材来自公开信息和社区讨论。如果你对这个话题有更深入的一手经验,欢迎指出文中的不足。