PS2 Web Recomp:静态重编译方案,在浏览器里跑PS2游戏,WebGPU硬件渲染

PS2 Web Recomp 是一款基于静态重新编译技术的PS2模拟器项目,是 psp-web-recomp 的姊妹项目。核心思路:提前把PS2 Emotion Engine(EE)原生机器码翻译成C++,再编译成WebAssembly,主CPU代码不采用解释执行;PS2其余硬件、BIOS、操作系统由运行时模拟,3D渲染交由WebGPU计算着色器完成,直接在浏览器运行PS2游戏。

仓库本身不含任何游戏ROM,需要使用者自备合法拥有的游戏ISO镜像,本地脚本将游戏打包成可网页运行版本。

PS2 Web Recomp:静态重编译方案,在浏览器里跑PS2游戏,WebGPU硬件渲染插图

已验证可运行游戏

  1. Gran Turismo 4(GT赛车4):作为首个成功移植作品,PS2平台硬件压力极高,依赖双向量单元、精准浮点运算与帧缓存调色板回读图形技巧。完整跑完开机、过场动画、菜单、比赛,音画完整,进度保存在浏览器记忆卡。PAL版50fps,笔记本集成GPU Chrome中可2倍分辨率全速运行。
  2. God of War II(战神2):无需游戏专属补丁,测试中发现了重编译器、向量单元时序、IOP处理器多处缺失逻辑。当前可从菜单、过场动画进入战斗;原生分辨率激烈战斗稳定60帧,2倍分辨率48–60帧(受限于集成显卡)。
    目前项目仅成功启动四款游戏,其余游戏大概率会遇到未实现系统调用、IOP库缺失或GS渲染特性未支持而无法运行。

核心技术原理

  1. EE静态重编译

eerecomp读取游戏可执行文件,按16KiB代码块提取函数,生成C++代码。完整保留R5900 CPU特性:128位寄存器、多媒体指令、延迟分支槽、PS2独特浮点规则(无INF/NaN、非规格化归零)、VU0协处理器。函数间跳转转为尾调用,不需要为客户程序单独分配栈空间。静态分析无法捕获指针跳转函数,会通过多次无头运行游戏迭代收集缺失入口点,反复翻译直到不再发现新代码地址。

  1. 分层系统模拟

EE侧操作系统采用高层模拟:线程、信号量、DMA、垂直消隐中断、SIF通道。IOP处理器(R3000)采用解释器运行游戏IRX模块、音视频与存储驱动;IOP内核与库函数改用C++重实现。光盘采用HTTP Range分片读取,启动阶段仅下载可执行文件。

  1. 向量单元VU

PS2绝大多数3D运算由VU1微程序完成。微程序流水线延迟、MAC运算、裁剪标志严格建模,遵循PS2特殊浮点规则。首次遇到的VU微程序即时编译为Wasm模块,编译耗时仅数毫秒;测试阶段识别到的微程序会提前编译为SIMD C++。

  1. WebGPU图形管线

GS图形合成器4MB显存保留原生swizzled布局,全部渲染由WebGPU计算着色器做瓦片光栅化,完整复刻GS纹理、调色板、Alpha混合、深度测试规则。帧缓存读写、渲染到纹理这类经典PS2特效和真机表现一致。支持原生、2倍、3倍内部分辨率;附带软件光栅化器,用于GPU渲染结果对照校验。模拟多线程拆分:模拟主逻辑Worker、VU1独立Worker,GS命令通过环形缓冲区交给页面主线程持有WebGPU设备。

  1. 音频与视频解码

SPU2音频模块完整复刻48路ADPCM、ADSR包络、流式DMA,音频输出通过AudioWorklet播放。IPU单元实现MPEG-2硬解,处理游戏内过场影片。

性能优化关键手段

早期版本使用软件光栅化+VU解释器,GT4仅3帧。通过WebGPU计算着色器渲染、VU微程序预编译,性能提升至70帧左右;

  • 优化GPU提交批次,减少计算调度次数;
  • 建立GPU显存最近上传缓存,减少重复纹理跨设备传输,降低60%每帧传输数据;
  • 统一三角形着色器加载逻辑,消除分支发散;
  • 改用MessageChannel调度模拟循环,避开setTimeout 4ms时间钳制,把模拟逻辑放到Web Worker,主线程只负责GPU提交,稳定帧率。

构建与使用流程

依赖:git、CMake、Ninja、C++20编译器(推荐clang)、Python3,7-Zip(处理7z镜像)。Linux x86_64为主开发环境,Apple Silicon macOS也可编译。

git clone https://github.com/snuri00/ps2-web-recomp.git
cd ps2-web-recomp
scripts/port.sh mygame "My Game.iso"
python3 scripts/serve.py build/web-mygame games/mygame/disc.iso

port.sh接收ISO镜像,自动完成机器码静态翻译、无头迭代探测函数入口、VU微程序采集,打包网页产物。战神2在8核笔记本上构建耗时约3分30秒。生成产物占用磁盘约300MB(镜像只是链接,不复制)。

配套serve.py自动配置跨域隔离响应头,满足SharedArrayBuffer运行要求,提供Range请求支持光盘流加载。

浏览器与原生运行器

浏览器端

  • 要求WebGPU,Chrome/Edge原生支持;Linux Chrome需要手动开启WebGPU Flag;WebGPU不可用时降级软件渲染,3D性能很差。
  • 输入:键盘映射、标准Gamepad API,手柄支持压力感应扳机与震动;移动端提供屏幕触控;F键全屏。
  • 存档:浏览器本地存储记忆卡,支持导入/导出.ps2存档文件,兼容PCSX2存档格式。

原生运行器

使用--native-only参数构建独立窗口程序,wgpu-native+Vulkan渲染,SDL2负责音频输入输出,支持Steam Deck。支持全屏、分辨率倍率设置,可单线程强制模式调试。

法律说明

项目代码本身开源,不含任何游戏资产。游戏ISO的机器码翻译产物版权归游戏版权方,仅允许本地自用,禁止公开分发。请使用你合法拥有的游戏光盘镜像。PlayStation、Gran Turismo、God of War是索尼旗下商标,本项目和索尼无任何关联。