《任天堂明星大乱斗 DX》(Super Smash Bros. Melee)2001 年登陆 GameCube,发售时根本没有网战。二十多年后,身处不同大洲的陌生人却能在线上打竞技对局,而且手感接近本地对战。这不是官方补丁做到的,而是一个社区项目 Project Slippi 做到的:它在一款从未为联网而设计的游戏底下重建了网战代码,并且让这款游戏跑在改装过的模拟器里,而不是原来的主机上。
一眼看懂
问题:Melee 是 2001 年的本地多人 GameCube 游戏,发售时没有内置网战。
社区答案:社区改装项目 Project Slippi 基于改装版 Dolphin 模拟器,在 2020 年 6 月加入了回滚网战与内置匹配。
核心思路:回滚先预测对手输入、继续进行,预测错了就倒回并重新模拟。
为什么在这里行得通:模拟器掌握整台机器的状态,所以游戏可以被倒回,这是封闭主机游戏很难直接做到的。
硬边界:回滚只是掩盖延迟,并不能消除延迟。网络差时仍会出现可见的修正,而且 Slippi 不是任天堂官方功能。
一款发售时没有网战的游戏
《任天堂明星大乱斗 DX》由 HAL Laboratory 开发、任天堂发行,登陆 GameCube。日本首发是 2001 年 11 月 21 日,北美是 2001 年 12 月 3 日。它的多人模式是本地的:最多四名玩家共用一台主机、一个屏幕。它没有可以打补丁的网战模式,因为这款游戏从一开始就不是为联网而做的。
这一点要先讲清楚,因为后面的故事都从这里推导出来。Slippi 不是改进了一个已有的网战模式,而是在一款没有网战的游戏上从外部加上了一个,而且没有原始源代码。做法是逆向工程加模拟器,不是官方更新。Slippi 是社区项目,不是任天堂产品,本文任何地方都不应被理解为任天堂为它背书。
延迟是等,回滚是猜
老式格斗游戏网战用的是延迟式网战。两台机器先等到对方确认过的输入,再一起前进一步。网络一慢,整局游戏就跟着等,每次按键都感觉迟到。Dolphin 自带的 NetPlay 就是这种方式,休闲玩玩够用。但对 Melee 这种又快、对输入又敏感的游戏来说,等本身就是问题。
回滚走了相反的 trade-off。每台机器对本地输入立刻反应,先猜对手在做什么,然后继续模拟。几帧之后对手的真实输入到了,机器把它和自己的猜测对照。猜对了,画面上什么也不会发生;猜错了,机器就倒回上一个正确状态,用修正后的输入重新模拟到当前帧。你自己的按键永远不会感觉迟到,因为它从来没有等过。
代价出现在别处。已经被显示出来的错误猜测必须公开修正,所以角色看起来会从一个位置瞬移到另一个位置。回滚实现通常还会保留少量输入延迟缓冲,让猜错的次数先降下来。这门技术的艺术就在于平衡这两项成本:用一点延迟换取修正更少,修正发生时又要修得够快。
为什么模拟器能做到主机做不到的事
回滚需要三样东西,而 2001 年的主机没有一样是现成可用的。第一,游戏必须确定:同样输入、同样起点必须永远得出同样结果,否则用修正输入重放会落到别处去。第二,程序必须能快速保存和恢复完整状态,每秒很多次,因为每一次修正都是一次倒回。第三,两台机器必须对哪一帧发生了哪个输入达成精确一致。
模拟器改变了这个等式,因为它已经把整台模拟主机握在自己的内存里。这个项目基于一个叫 Ishiiruka 的 Dolphin 分支,游戏一侧的改动放在公开的汇编仓库 slippi-ssbm-asm 里。说成人话就是:注入到运行中游戏里的小段汇编补丁负责向外上报输入与游戏事件,模拟器核心负责网络交换与倒回。游戏本身从来没有学会联网,是包在它外面的壳学会了把它倒回去。
社区讨论里强调了一个容易被忽略的实际细节:直接用模拟器普通的存档功能对逐帧回滚来说不够快。团队必须找到一种在游戏内部生成游戏状态的办法。本文没有把这个机制写成代码,因为公开讨论只描述了思路、没有给出简短可验证的片段,编一段出来比略去更糟。诚实的总结是:状态生成,而不只是预测,才是难的部分。
Slippi 实际建成的是什么,一步一步看
Slippi 一开始并不是网战。它在 2018 年 6 月 18 日公开上线,此前经历过小范围测试,第一个版本讲的是录像与统计:对局会被自动存成体积很小的 .slp 录像文件,工具可以读取这些文件算出对局统计。另一条主机一侧的分支 Nintendont-Slippi 可以把主机上的实时输入镜像到 Dolphin,让赛事用模拟器画面而不是主机原始画面来直播。
网战是后来才到的。2020 年 6 月 22 日,定制版 Dolphin 构建的一次更新加入了回滚网战与内置匹配,玩家不用借助外部网站就能排到随机对手。时间点很关键:线下赛事自 2020 年 3 月以来基本停摆,Slippi 成了让竞技 Melee 活下去的主要方式。项目由 Fizzi 牵头,UnclePunch、Nikki 与 metaconstruct 作出主要贡献,Fizzi 后来宣布全职投入 Slippi。
匹配随后长出了记忆。2021 年 1 月 19 日的 2.2.4 版在随机非排位对局里引入了隐藏匹配分,低分玩家的搜索范围被大幅收窄,而普通与高水平玩家的搜索范围保持较宽,这样新人就不会一场接一场被高手碾压。此后的版本继续在竞技规则集上小步迭代,包括 2025 年 8 月的 3.5.0 版解冻了宝可梦竞技场的场地变化。模式始终如一:一款游戏、一个社区、持续的小改动,全部发生在官方更新渠道之外。
只认一个版本的规则
Slippi 只针对游戏的一个特定版本调校:Melee NTSC 1.02。这不是偏好,而是方法的要求。回滚成立的前提是两台机器模拟的是同一款游戏,不同版本之间的差异会破坏这种一致。如果两边的模拟各自漂移,再怎么倒回也无法弥合,因为每台机器都在正确地重放一款不同的游戏。锁定一个版本,就是社区项目买下确定性的方式,而官方开发者通常是靠向所有人发同一构建来保证这一点的。
回滚修不掉的东西
回滚常被说成几乎没有延迟,这个说法应该被理解为手感描述,而不是测量结果。它不会让数据包跑得更快,不会修复丢包,也不会把抖动严重的无线连接变成有线连接。网络差的时候,修正会变得频繁而显眼,到了一定程度,任何网战代码都救不了这局。想打好对局的人首先还是要在意连接质量,因为回滚只决定剩下的延迟以多优雅的方式被藏起来。
非官方身份也有真实后果。The Big House Online 计划用 Slippi 在线上办 Melee 赛事时,任天堂发来了 cease and desist 函,称该项目侵犯其著作权,赛事随之取消。SmashWiki 同时记录,任天堂至今没有在法庭上证明这一侵权主张,这一事件催生了 FreeMelee 运动。对开发者的教训不是法律建议,而是一个范围警告:社区改装的生存取决于权利人的态度,这是官方授权网战永远不需要面对的。本文不提供任何获取游戏的步骤,因为游戏本身不是 Slippi 的一部分,读者如何获得它不在本文教授的范围之内。
GGPO 的关系,要说得精确
这整套技术的早期模型是 GGPO,即 Good Game Peace Out,由 Tony Cannon 创建。GGPO 预测对手输入、不等待直接模拟,猜错时倒回上一个正确状态、再用修正后的输入重放。2019 年 10 月 9 日,Cannon 宣布 GGPO 以 MIT 协议开源,此前它已经为《骷髅少女》《杀手本能》《街头霸王 III:三度冲击 Online Edition》等游戏提供过网战。
这段历史很重要,也必须说得精确。GGPO 是参考模型,Slippi 属于同一技术家族。本文不声称 Slippi 内含 GGPO 代码,因为已核查的来源没有确立这种代码血缘,而且公开记录里两者是分开描述的。Slippi 可以证实与 GGPO 共享的是思路:预测、倒回、重放。而把补丁注入一款 2001 年的 GameCube 游戏、再在模拟器里把它倒回去的那一半,是 Slippi 自己的工作。
开发者清单
承诺回滚之前,先问游戏是否确定性。同样输入会得出不同结果,修正重放就无法收敛。
把状态保存与恢复当作一等成本,而不是免费功能。回滚能多快,取决于最便宜的一次正确倒回。
联机只认一个版本。玩家版本不一致就是 desync,不是平衡差异。
保留少量输入延迟缓冲。几帧有意的延迟可以避免很多可见修正。
衡量手感,而不只看延迟。统计修正次数与幅度,而不只看 ping,因为玩家对瞬移比对毫秒更敏感。
行文里把社区作品与官方身份分开。如果是民间改装,第一页就写明,不要藏进脚注。
证据边界:本文不声称什么
本文不声称什么。本文不含代码,因为在已核查来源中没有确立可验证的 Slippi 状态生成代码片段,本文也不假装运行或测试过任何 Slippi 构建。本文没有自己的帧数、ping 或延迟实测数据。常被引用的几乎无延迟说法,在这里只作为手感描述,而不是测量结果。社区讨论中提到的 Melee 原生硬件输入延迟细节属于二手讨论,本文不把它当作事实断言。当前启动器版本号被有意略去,因为二手汇总说法不一,且本文没有核实到单一主要发布说明。Slippi 是社区项目,不是任天堂官方功能,本文不提供任何获取游戏的步骤。
来源
SmashWiki《Project Slippi》:项目历史、组件、功能与发布日期,包括 2018 年 6 月 18 日上线、2020 年 6 月 22 日回滚与匹配更新、2021 年 1 月 19 日隐藏匹配分。
PC Gamer《Super Smash Bros. Melee emulation now has a fully-featured online mode》:Melee 2001 年登陆 GameCube 时没有网战功能,Slippi 被描述为 Dolphin 的粉丝自制补充。
Kotaku《Fans Just Gave Super Smash Bros. Melee Cutting-Edge Online Multiplayer》(2020 年 6 月 23 日):回滚网战、内置匹配与自动保存录像,以及早期竞技选手反应。
Project Slippi 公开仓库(GitHub project-slippi 组织):Ishiiruka 版 Dolphin 分支、slippi-ssbm-asm 汇编仓库与 Slippi Launcher,为本文架构部分的来源。
Project Slippi 开发博客(Medium,SmashWiki 外链所列):项目背景阅读,本文没有依赖其中某一篇来支撑具体事实断言。
Hacker News 关于 Slippi 回滚实现的讨论帖:关于游戏内状态生成难题、以及模拟器普通存档对逐帧回滚太慢的社区讨论。
GGPO 参考:Tony Cannon 的 GGPO,2019 年 10 月 9 日宣布以 MIT 协议开源,及其预测、倒回、重放模型。
Melee 发售记录:HAL Laboratory 开发、任天堂发行,GameCube,日本 2001 年 11 月 21 日、北美 2001 年 12 月 3 日。
相关案例拆解
一行被重算 63000 次的字符串长度,是怎么让 GTA Online 读盘 6 分钟的
Unity 大型 RTS 一个月帧数翻 3 倍:先查 profiler,再谈重构
《堡垒之夜》第 4 章是怎么把 UE5.1 的新功能扛到 60 帧的

