Synth Daily

极限速通《Metroid》:优化通关之路

Antithesis 公司使用任天堂游戏作为其测试平台的研发工具,而非营销噱头。以《银河战士》为例,平台在测试中遇到了一个无法通过的“红门”障碍,原因是系统不懂得积攒通关所需的导弹。为了解决这个问题,团队开发了一种新的优化算法,该算法能在探索地图的同时,优先选择导弹数量更多的状态。这项创新不仅帮助平台成功通关了游戏并发现了其中的漏洞,更重要的是,它演变成了一项核心技术,能更智能、更高效地测试各类复杂的软件系统。

游戏是严肃的研发工具

将游戏作为测试环境并非儿戏,而是解决实际问题的方法。通过提出“为什么模糊测试器(fuzzer)无法通关《塞尔达传说》”这类问题,我们逐步构建了 Antithesis 平台。从游戏测试中吸取的经验,能够很好地迁移到我们为大型复杂分布式系统提供测试的核心业务中。

“红门”难题

在测试经典游戏《银河战士》(Metroid) 时,我们的自主系统表现出色,能够轻松地击败敌人、收集道具并探索地图。然而,它始终被一种特定的红色门挡住去路。

通过分析测试数据,我们发现系统能够到达红门前,但无法打开它。问题很快就清楚了:

  • 开门条件: 打开一扇红门需要用 5 枚导弹 射击。
  • 系统行为: 我们的系统在获得导弹后,会迅速将其用于攻击敌人,因为它发现这样做能更轻松地推进游戏。
  • 最终结果: 系统从未在拥有 5 枚或更多导弹的情况下抵达红门。

本质上,系统学会了使用消耗品,但没有学会为了长远目标而“储蓄”资源。

探索解决方案的弯路

如何让系统学会积攒导弹?我们考虑过几种方案,但它们都有缺陷。

  • 方案一:追踪导弹数量 将导弹数量加入到系统追踪的状态变量中(例如,从 {x, y} 坐标变为 {x, y, 导弹数})。这种方法虽然能确保系统探索所有导弹数量下的地图位置,但会导致状态空间急剧膨胀,不仅消耗大量内存,也让计算资源过于分散,效率极低且无法扩展

  • 方案二:强制保留导弹 设定一个严格规则:“一旦获得导弹,就必须始终保持 5 枚以上”。这个方案又过于死板。在某些情况下,使用导弹是必要的,而且之后可以重新收集。这种过度限制会阻碍系统探索那些必须消耗导弹才能进入的区域。

我们真正想要的是一种更灵活的方式,即告诉系统:“在探索所有地图位置的同时,如果其他条件相同,优先选择导弹更多的状态。”

突破:引入优化算法

这个需求催生了一种新的算法。它不仅记录探索过的位置,还为每个位置关联一个需要优化的值(例如导弹数量或生命值)。当系统再次到达某个位置时,会比较当前状态和之前记录的状态。如果当前状态“更优”(例如导弹更多),它就会取代旧的状态成为新的代表。

虽然这个想法听起来简单,但要实现一个能处理复杂、动态变化的状态图,并且运行速度足够快的系统,技术难度非常高。但最终的效果是显著的。

优化带来的惊人成果

一旦启用新的优化算法,系统行为发生了质的改变:

  • 探索效率提升: 当以生命值为优化目标时,系统迅速学会了保持高血量,这反过来让它能更快、更安全地探索地图。
  • 攻克核心难题: 当加入对导弹数量的优化后,系统立刻积攒了足够的导弹,成功打开红门,并顺利推进游戏。
  • 涌现智能行为: 系统自发地学会了一些高级技巧,例如在特定地点“刷”小怪来补充生命和导弹,这与人类玩家的行为非常相似。
  • 发现游戏漏洞: 强大的探索和优化能力使其发现了游戏中的多个漏洞,包括利用炸弹跳跃来打破正常游戏顺序,甚至穿墙进入地图外的无效区域。

最终,系统击败了最终 Boss,成功通关了整个游戏。

优化是测试的核心

为《银河战士》开发的这项技术,其意义远超游戏本身。这种“在模糊测试的同时进行持续优化”的能力,是现代测试工具的核心需求。

无论是寻找软件的内存泄漏、检测分布式系统的性能瓶颈,还是发现导致缓冲区溢出的输入,本质上都是一个优化问题。从游戏中诞生的这项技术,已经成为我们测试所有复杂系统的强大武器。