四万一千个 star。昨晚刷到 AnyPS5,标题说能把 PS5 的可执行文件自动移植到 Linux 和 Windows。
心里冒出一句「这个我总看得懂吧」。
并没有。
先把我唬住的是提交数,九千五百多次。我对这个数字没概念,我那个练手仓库到现在二十来次提交,其中至少五次是改拼写错误。
点进 README,relinker、prx、SPIR-V、Vulkan,每个词单独看都认识,连在一起我不知道它在干嘛。
「不依赖模拟器,也不需要额外的运行时进程。」这句我一开始以为看懂了。模拟器我大概知道怎么回事,一个程序假装自己是另一台机器。那不用模拟器,它靠什么把 PS5 的东西跑起来?
盯了一会儿才把注意力挪到 relinker 上。项目说这是个重链接器,负责把 PS5 可执行文件转成目标平台的原生格式,另外还实现了一套系统 prx 库,用来替掉 PS5 上对应的系统模块。
字面我读懂了。但把一个 PS5 的二进制“重链接”到 x86 的 Linux 上,中间到底发生了什么,我说不出来。是改了 ELF 头?是把符号重新指到自己的库上?还是别的什么?不知道。
……先记着。
有一段我读了三遍,免责声明。大意是不包含也不分发、不依赖任何受版权保护的软件、固件、密钥或者专有库,用的人自己保证手上那些二进制来路正当。
第一遍读完,脑子里冒出来的是一句「那它到底给了什么」。
现在回头看这反应挺蠢的——它给的是工具和库,不是内容,本来就是两件事。但当时我确实卡在那儿三十秒。这个是不是大家都知道啊,可能就我一个人绕了这一圈。
我一度想把它当学习材料。下载,打开 core 目录,看了三分钟,关掉了。不是写得不好,是我连从哪儿开始看都不知道。九千多次提交攒出来的东西,我拿它当教程,大概等于拿字典当小说读。
反正我现在点开一个陌生仓库,先看它怎么写自己做不到的事,比看它怎么写自己能做到的有意思。
真正让我认真往下看的是「系统库进度」那一段。
百分比是按已知函数占比算的。关键是后面那句:统计范围只是 core/libs/prx 里已经声明出来的函数,不是 PS5 全部系统函数,声明变多,分母还会继续扩大。
我读了两遍。
也就是说这个进度条理论上能往回退。你越往深里做,声明出来的函数越多,你越清楚自己还差多少,百分比反而越低。
……
这不就是我吗。
两个月前我把「跑通了」当成「学会了」,一个功能跑起来就在心里给自己打个勾。现在知道跑通只能说明分母还没暴露。
三周前的我刷到这个仓库,大概只会看一眼 star 数,收藏,然后再也不点开。
还有个细节我抠了半天。项目里说,遇到不支持或者异常状态,程序会抛 std::runtime_error,把 what() 打到 stderr,然后终止进程。
大概长这样吧,我没真跑过:
terminate called after throwing an instance of 'std::runtime_error'
what(): ...
第一反应:就这?直接就终止了?
但我自己代码报错的时候是什么样——一段红字,或者干脆静默返回一个我看不懂的值,然后我在那儿猜半天。人家至少明确说了「这个我没支持」,然后停。
不确定这是不是设计上的取舍。但「不支持就明确失败」这件事,我心里有点服气,也有点说不上来的滋味。
着色器那块说能生成 SPIR-V,校验要开 ANYPS5_ENABLE_SPIRV_TOOLS 这个构建选项才有。第一反应是为什么不做成默认开。后来想可能是构建时间和依赖的问题,但我没验证过。这条我到现在也没搞懂,先记录着。
有个东西我觉得比进度条有用:单个游戏的兼容情况是社区项目 blocker map 基于公开的 GitHub 数据汇总出来的,测试报告集中在 Game bring-up 讨论区,一款游戏一个帖子。
我喜欢这个结构。它告诉你的不是「完成了百分之几」,是卡在哪一步、卡在哪个库、GPU 覆盖到哪了。
百分比是个很省事的数字,但它不告诉你下一步该干什么。一个具体的阻塞点会。
重链接器那部分我还是夹生的,prx 库怎么顶掉系统模块我也说不清楚。下一步我想去翻 demo/web 那个目录,因为项目说网页版转换的时候文件一直留在自己设备上、不上服务器——这点我比较在意,我平时跑 Claude Code 也在自己机器上,能出门的东西最好别出门。而且网页版至少能让我看到输入进去、出来个什么东西,比对着 README 猜强。
评论区蹲一个大佬:relinker 到底动了二进制的哪一部分,有没有人能一句话讲明白的?还有,你们是不是也有那种看了一晚上、每个词都查过、但还是没搞懂的东西,说出来让我心里平衡一下。
