不靠模拟器跑 PS5 程序:AnyPS5 非模拟器 PS5 原生移植路线拆解
【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/GitHub_Trending/an/AnyPS5
一份 PS5 程序的 ELF 文件,不需要逐条模拟 CPU 指令,就能被改写成本地 Linux 或 Windows 的原生可执行文件。这就是 AnyPS5——一个非模拟器路线的 PS5 原生移植工具:它不扮演 PS5,而是把程序本身改写成宿主系统可以直接运行的形态。
📌 原生移植 vs 模拟:两句话讲清区别
一句话:模拟器在运行时"穿着 PS5 的外套",逐条翻译指令、逐个拦截系统调用;AnyPS5 在运行前就把程序改写成了宿主的"母语"。
| 维度 | 传统模拟器 | AnyPS5 原生移植 |
|---|---|---|
| 程序代码 | 运行时逐条翻译或解释 | 转换期一次性转为宿主原生 ELF / PE |
| 系统功能 | 伪系统层拦截执行 | 直接链接到项目构建的 prx 系统库 |
| 运行形态 | 独立的模拟进程 | 普通宿主进程,无额外运行时 |
所以中间不存在"模拟层":跑起来的就是程序本身,唯一带"客"字的是那套系统库。
⚙️ 跟一次运行:从解析到画出第一帧
转换好的游戏跑起来之前,时间线上只发生三件事。
解析与重链接。relinker 读入 ELF,按 NID 梳理程序需要的系统函数、过滤未使用的导入,把随包模块一并转换,然后写出目标系统的原生格式——这就是"relinker 转换 PS5 可执行文件"的全部,管线入口在 core/relinker/main.cpp。
启动时系统调用被接管。程序一启动,它就是普通的宿主进程:它调用的每个系统函数,都由操作系统加载器解析到libs/里的 prx 系统库(libkernel、libScePad、libSceVideoOut等),来源见 core/libs/prx。这些库的导出名在构建期被统一改写成 NID,两边因此能找到彼此。
渲染走 Vulkan 管线。画面帧到达时,游戏把命令缓冲提交给图形驱动;RDNA 着色器指令被解码、翻译成中间表示、优化,最后由着色器重编译器输出 SPIR-V 交给 Vulkan——整条管线在 core/shader/recompiler/Recompiler.cpp,编译结果有磁盘缓存,第二次启动明显更快。
🚀 三步把 input.elf 变成能跑的程序
第 1 步:准备输入目录。干净的 ELF 可执行文件与随包模块放在一起,目录结构见 docs/user/USAGE.md:
source/ input.elf sce_module/ <随包 ELF 模块>第 2 步:一条命令完成转换。relinker 一次生成目标系统的原生文件:
relinker source/input.elf app.elf # 输出 Linux ELF relinker --windows source/input.elf app.exe # 输出 Windows PEIntel 平台上可加--to-intel(下文 FAQ 有说明);macOS 的 x86-64 Mach-O 也支持。
第 3 步:摆放运行时目录。以下路径都相对于输出可执行文件:
app.elf(Linux)或 app.exe(Windows) libs/ *.prx # 项目构建出的系统库 app0/ <游戏资源> sce_module/ # 转换后的随包模块把build/core/libs/libs/*.prx拷进libs/,Linux 下执行./app.elf,Windows 下执行.\app.exe。
贴士:
--rpath默认值是$ORIGIN/libs,即系统库默认从可执行文件旁边的libs/加载。注意libs/只放本项目构建的.prx,不要放 PS5 原版.prx——在 Windows 上它会被当成 DLL 加载并直接报 error 193。
⚠️ 现在能跑什么,边界在哪
诚实地交代进度:
- 已验证的游戏(完整列表见 docs/user/COMPATIBILITY.md):Dreaming Sarah(2D 平台游戏)在 Windows 下可进游戏游玩,GTX 1050 Ti / i5-7500 下 60 FPS,Intel HD 620 下 36 FPS;自制游戏 DOOM Shareware 在 Windows 和 Linux 都能进 E1M1,实机内游戏约 35 FPS,其中一个测试环境甚至是 llvmpipe 软渲染。Linux + Intel GPU 的组合尚未验证。
- 失败是显式的:不支持或未预期的状态严格抛出
std::runtime_error,what()打到 stderr,进程终止,不存在"半死不活"的降级。 - 构建环境:x86-64、CMake 3.22.1 起、Ninja、C++20;Linux 用 GCC/G++,Windows 目前只支持 MinGW-w64 GCC 15.2.0;FFmpeg 二进制在配置阶段自动下载。细节在 docs/dev/BUILD.md。
git clone https://gitcode.com/GitHub_Trending/an/AnyPS5 cd AnyPS5 git submodule update --init --recursive cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build --parallel cmake --build build --target libs --parallel最后一行的libstarget 是必须的一步,build/core/libs/libs里的.prx靠它产出。
🎮 手柄、键盘、鼠标怎么接
手柄自动识别:SDL 映射下的 Xbox 与 PlayStation 手柄使用标准 PS 键位,摇杆和模拟扳机直通,运行中热插拔也不影响,第一个被识别的手柄生效。
键盘和鼠标默认用内置键位;想自定义就在可执行文件旁新建anyps5-input.ini,每行一条Action = Type:Value,比如把 Cross 改成 F 就写Cross = KEY:F。文件想放别处可用ANYPS5_INPUT_CONFIG指定。支持的动作列表、摇杆死区、鼠标灵敏度参数都在 docs/user/INPUT_MAPPING.md。
❓ 你大概率会问的三件事
要不要自备 PS5 固件或专有库?不需要。README 的免责声明写得很清楚:项目服务于互操作、研究、保存与兼容目的,不包含、不分发、也不要求任何受版权保护的软件、固件、密钥或专有库。你运行哪个二进制、它是否合法获取,责任在你自己。
报错时为什么直接终止,而不是降级继续?因为静默降级会把兼容性问题埋掉。AnyPS5 的策略是不对就抛异常、死得干脆,错误信息精确告诉你卡在哪,游戏跑不起来时你能直接对着报错修;文档甚至明确警告:为调试启用那些弃用标志会让程序"极其不稳定,不适合通用"。
我的 CPU 是 Intel,能跑吗?部分可以。--to-intel会把可执行文件和随包模块里发现的 AMD 专属指令改写成 Intel 兼容指令;但游戏运行时动态生成的新指令无法提前翻译,这类游戏就要求 AMD CPU 宿主。
🧭 接下来读什么
想深入源码,从两个入口开始:core/relinker(重链接管线,从main.cpp顺着读能看到完整路径)和 core/shader/recompiler(独立、纯函数式的模块,以Recompiler.cpp为主线)。文档先读三份就够:docs/user/USAGE.md(转换与运行时布局)、docs/dev/ARCHITECTURE.md(架构图与数据流)、docs/user/COMPATIBILITY.md(游戏清单)。core/libs/tests 里的测试集则展示了每个系统库是怎么被验证的。已验证的游戏名单每长一点,这条原生路线的成色就实一分。
【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/GitHub_Trending/an/AnyPS5
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考