AnyPS5:不模拟主机,直接把 PS5 可执行文件重新链接

有一类项目会在 GitHub 上莫名其妙地火起来,没人写得清原因。AnyPS5 就是其中之一。它挂在周榜榜首,新增大约 16,000 star,提交数接近 10,000,而它那句一句话简介——「把 PS5 可执行文件自动移植到 Linux 和 Windows 的工具」——正是那种会让律师伸手拿笔、让工程师伸手点收藏的句子。
有意思的不是它存在,而是它拒绝成为什么。
没有模拟器,没有运行时,没有窗口里的主机
大多数在 PC 上跑主机软件的项目都是模拟器。它们给硬件建模:CPU、GPU、内存布局、时序。这条路走通了是奇迹,走不通就是长达十年的苦工,因为每一款游戏都变成了一场谈判——对手是一台没人拿到完整文档的机器的不完整模型。
AnyPS5 走的是另一条路。它提供的是一个 relinker,把 PS5 可执行文件转换成目标平台的原生格式,另外还实现了该可执行文件期望链接的系统 prx 库。README 把后果说得很直白:没有模拟,也没有独立的运行时进程。游戏代码以原生代码的形式跑在你的机器上,调用的是被重新实现的系统库,就像它原本调用索尼的库一样。
这个承诺要兑现难得多,可一旦兑现,回报也大得多。模拟是对每一条指令收税。重链接只对边界收税——只对那几处从游戏跨进系统层的调用收税。
决定成败的那部分:着色器
游戏基本上就是一群披着游戏外衣的着色器。一款 PS5 作品带的是为特定图形栈编译好的 GPU 程序,而 Windows 或 Linux 机器想要的是驱动能咽下去的东西。AnyPS5 里有个着色器重编译器,输出 SPIR-V;仓库里注明,当构建启用 ANYPS5_ENABLE_SPIRV_TOOLS 时,会用 SPIRV-Tools 校验输出。
校验 SPIR-V 和跑起游戏不是一回事。它只说明生成的模块在结构上合法,而这正是「也许能跑」和「驱动会拒收它,而且极难调试」之间的差别。任何盯着一块黑屏熬过一晚上的人都懂这项检查值多少。
项目自己的进度页对数字的含义很谨慎。库覆盖率是按「项目目前已经声明过的函数」来算的,不是按 PS5 暴露出来的全部函数来算的。这种表述很诚实,也意味着随着项目一点点发现自己的无知,这个百分比还会继续动。
它是怎么失败的——而且是故意这么设计的
有一个设计决定很能说明这套代码库的成熟度。遇到不支持或意料之外的状态,它抛 std::runtime_error;消息打到 stderr,进程直接终止。
听起来很粗暴,但这是对的。另一种做法——猜一猜、接着跑、把状态弄脏——会在三帧之后、在一个跟真正的 bug 毫无关系的地方崩掉。处于这个阶段的项目需要的是响亮、尽早、具体的失败。十月中旬有个提交,修的正是这类顺序问题导致的 Windows 测试挂起:在 Windows 上,从 main 返回的测试会走 exit,而 exit 会在 DLL detach 时静态析构函数运行之前干掉其他所有线程;如果这时某个析构函数还在等一个已经死掉的 logger,它就永远不会返回。修复办法是在 MinGW 上给 main 包一层,改为通过 libc 终止进程。这活儿不体面,但正是这种活儿把 demo 和工具区分开来。
输入,还有那些不起眼却要命的小事
SDL 映射的手柄能用,摇杆和扳机都算在内。键鼠通过 anyps5-input.ini 配置。还有个网页转换器,文件在本地处理,什么都不会上传。
逐游戏的兼容性并没有维护在 README 里。它放在一张用公开 GitHub 数据搭起来的社区 blocker map 上,每个标题在仓库的 discussions 里都有对应的测试回报帖。下载之前值得先弄明白这一点:这个项目追踪的是每款游戏卡在哪里,而不是一份「能跑」的绿色清单。
那段你真正该读的法律声明
免责声明说,本项目用于互操作、研究、保存和兼容性。它声明不包含、不分发、也不要求受版权保护的软件、固件、密钥或专有库。它还说明,用户有责任确保自己使用的任何二进制文件是合法取得、合法使用的。
这条线画得很小心,而它就是全部的关键。工具本身是 GPL-2.0-only,不含任何游戏数据。你喂给它什么,是你自己的事;而且在大多数司法辖区,「我自己重链接的」并不是一条经过法庭检验的抗辩。
边界究竟在哪儿
relinker 的活儿是符号解析。可执行文件按名字要函数,工具得保证每一个名字在加载时都能解析到某个可调用的东西,调用约定要对,而且是在一台并非该二进制原本构建目标的机器上。漏掉一个,进程就在启动时死掉,通常只给你一条消息,里面写着一个库名,别的什么都没有。
所以项目那张覆盖率页面才是仓库里最诚实的文档。它报告的是项目已声明的函数里有百分之多少被实现了——不是 PS5 全部 API 面的比例。这两者差距巨大,也意味着当团队发现自己不知道的东西更多时,这个百分比会往下掉。大多数项目会把这种动态藏起来。这个项目在数字旁边加了条注。
GPU 那边是同一个逻辑。着色器翻译不是一个问题,而是每个着色器各是一个问题;一款游戏可能正常渲染二十分钟,然后撞上一条没翻译的指令路径,崩得看起来像驱动 bug。SPIR-V 校验这一步能尽早抓住结构性问题。它抓不住语义问题,而项目也没有声称能抓。
所以实际的问题不是「它能不能用」,而是「我这款游戏停在哪儿」,blocker map 逐游戏回答这个问题,还挂着对应的 issue。
为什么是现在火了
保存这件事正当时。光盘腐烂、商店下架、服务器关停——让软件继续可运行的理由已经不再感性,而是很实际。relinker 在某种意义上是保存工具,模拟器不是:它不需要给一台机器建模,只需要满足软件所期待的那个接口。
也有更简单的解释。这个项目体量巨大,提交成百上千地落地,其中相当一部分明显是在编码 agent 参与下写出来的——仓库里甚至有个 AGENTS.md,列出 agent 容易违反的规则。看着一个 10,000 次提交的项目在两个半月左右被堆出来,本身就是一场奇观,也解释了那条跟「能启动多少款游戏」关系不大的 star 曲线。
那它到底该怎么用
如果你手上有一个合法取得的可执行文件,又刚好有个空闲的晚上,诚实的预期是:你会学到很多关于现代主机游戏是怎么搭起来的知识,而且你大概率通不了关。先查你这款的 blocker map,提 issue 之前先读技术债文档,发布任何用它构建的东西之前先读许可证。
不管最后有多少款游戏能启动,更大的那一点都成立。二十年来,「这套主机软件能不能在别处跑」的答案一直是「除非有人把机器模拟出来」。AnyPS5 是第二个答案的一次严肃尝试;而它是公开写出来的,以这个速度,带着这么多不体面的管道活儿——这正是它该出现在 trending 页上的原因。
相关文章
五大出版社悄悄用AI做封面,读者已经开始认出来了
《连线》报道称,美国五大出版社中至少三家在未披露的情况下用AI生成封面与文案。官方回应与员工说法相互矛盾,而名字印在封面上的作者,往往是最后一个知道的人。
Character.AI 申请破产,迪士尼用 2000 万美元给专利兜底
Character.AI 申请破产,迪士尼以 2000 万美元充当马前卒,买的只是部分资产和专利许可。一个 1.5 亿美元 A 轮的故事,最后落在专利和每月八九百万美元的亏损上。
XERJ:一个会坦白自己数字灌水的编码代理搜索引擎
XERJ 用本地索引和 tree-sitter 符号帮编码代理少读文件:实测比 grep 省 2.7 倍 token,而不是标题宣称的 40 倍,维护者自己把这层窗户纸捅破了。
别再让 AI 盯着屏幕点鼠标了:CLI-Anything 给每个软件配一条命令行
别教 agent 看屏幕点鼠标。CLI-Anything 用七阶段流水线为 GIMP、Blender、LibreOffice 生成带测试和文档的 CLI,让 agent 直接敲命令。