PS2 Web Recomp 是一款基于静态重新编译技术的PS2模拟器项目,是 psp-web-recomp 的姊妹项目。核心思路:提前把PS2 Emotion Engine(EE)原生机器码翻译成C++,再编译成WebAssembly,主CPU代码不采用解释执行;PS2其余硬件、BIOS、操作系统由运行时模拟,3D渲染交由WebGPU计算着色器完成,直接在浏览器运行PS2游戏。
仓库本身不含任何游戏ROM,需要使用者自备合法拥有的游戏ISO镜像,本地脚本将游戏打包成可网页运行版本。

已验证可运行游戏
- Gran Turismo 4(GT赛车4):作为首个成功移植作品,PS2平台硬件压力极高,依赖双向量单元、精准浮点运算与帧缓存调色板回读图形技巧。完整跑完开机、过场动画、菜单、比赛,音画完整,进度保存在浏览器记忆卡。PAL版50fps,笔记本集成GPU Chrome中可2倍分辨率全速运行。
- God of War II(战神2):无需游戏专属补丁,测试中发现了重编译器、向量单元时序、IOP处理器多处缺失逻辑。当前可从菜单、过场动画进入战斗;原生分辨率激烈战斗稳定60帧,2倍分辨率48–60帧(受限于集成显卡)。
目前项目仅成功启动四款游戏,其余游戏大概率会遇到未实现系统调用、IOP库缺失或GS渲染特性未支持而无法运行。
核心技术原理
- EE静态重编译
eerecomp读取游戏可执行文件,按16KiB代码块提取函数,生成C++代码。完整保留R5900 CPU特性:128位寄存器、多媒体指令、延迟分支槽、PS2独特浮点规则(无INF/NaN、非规格化归零)、VU0协处理器。函数间跳转转为尾调用,不需要为客户程序单独分配栈空间。静态分析无法捕获指针跳转函数,会通过多次无头运行游戏迭代收集缺失入口点,反复翻译直到不再发现新代码地址。
- 分层系统模拟
EE侧操作系统采用高层模拟:线程、信号量、DMA、垂直消隐中断、SIF通道。IOP处理器(R3000)采用解释器运行游戏IRX模块、音视频与存储驱动;IOP内核与库函数改用C++重实现。光盘采用HTTP Range分片读取,启动阶段仅下载可执行文件。
- 向量单元VU
PS2绝大多数3D运算由VU1微程序完成。微程序流水线延迟、MAC运算、裁剪标志严格建模,遵循PS2特殊浮点规则。首次遇到的VU微程序即时编译为Wasm模块,编译耗时仅数毫秒;测试阶段识别到的微程序会提前编译为SIMD C++。
- WebGPU图形管线
GS图形合成器4MB显存保留原生swizzled布局,全部渲染由WebGPU计算着色器做瓦片光栅化,完整复刻GS纹理、调色板、Alpha混合、深度测试规则。帧缓存读写、渲染到纹理这类经典PS2特效和真机表现一致。支持原生、2倍、3倍内部分辨率;附带软件光栅化器,用于GPU渲染结果对照校验。模拟多线程拆分:模拟主逻辑Worker、VU1独立Worker,GS命令通过环形缓冲区交给页面主线程持有WebGPU设备。
- 音频与视频解码
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是索尼旗下商标,本项目和索尼无任何关联。










