用 C# 编写 PlayStation 5 模拟器:爱好者如何开发 SharpEmu
为现代游戏机编写模拟器是许多人联想到无尽的纯 C++ 代码和底层魔法的任务。然而,SharpEmu 项目的开发者们决定走一条不同的路,选择了 .NET。考虑到我们谈论的是 PlayStation 5——一个具有 x86-64 架构和特定图形 API 的极其复杂的系统,这听起来很有野心。
为什么程序员需要另一个模拟器
如果你关注这个领域,你可能听说过 ShadPS4。这个项目在运行《血源》和其它 PS4 大作方面已经取得了很大进展。SharpEmu 的作者们立即声明:他们并不试图竞争或复制任何人的工作。他们的目标仅限于 PS5。
SharpEmu 是一个实验性项目。它从零开始构建,用于教育目的和研究。开发者们只是喜欢深入研究系统架构和进行逆向工程。对我们来说,这是一个难得的机会,可以利用熟悉的 .NET 技术栈来了解现代游戏机"内部"是如何工作的。
这个项目今天能做什么
该项目处于早期阶段。不要指望下载一个二进制文件就能以 4K 分辨率运行《战神:诸神黄昏》。团队的重点是基础设施和模拟准确性,而不是运行特定游戏。
尽管如此,已经有了成果:
- 加载
eboot.bin和.elf文件。模拟器正确解析了主机可执行文件的结构。 - 执行原生 CPU 指令。
- 读取元数据:游戏名称、版本和其它服务信息。
- 处理系统模块(PRX)和部分内核函数支持。
- 初步的 PlayGo 场景和视频输出支持。
有趣的是,一些游戏已经到达 AGC(图形着色器引擎)初始化阶段并调用 sceVideoOut。例如,在《恶魔之魂:重制版》中,模拟器已经准备好了着色器,开发者们计划将其转换为 SPIR-V 以通过 Vulkan 进行渲染。
技术栈和灵感来源
为这样的项目选择 C# 是一个有趣的决定。现代 .NET(8 版本及以上)提供了出色的性能,在其中处理内存和数据结构通常比在 C++ 中更愉快。
SharpEmu 的作者们并不隐瞒他们正在借鉴同事的经验。几个知名项目影响了他们的代码和架构:
- Ryujinx:从这里他们采用了在 C# 中实现底层操作的模式和文件系统处理方式。
- Kyty:早期的 PS5 模拟器之一,作为原生代码执行的教科书。
- ShadPS4:帮助理解了索尼游戏机当前和前几代架构的一般原理。
目前,主要目标平台是 Windows。这简化了早期阶段的调试工作。Linux 和 macOS 的支持计划在代码库更加稳定后实现。
如何尝试
如果你想窥探内部甚至帮助项目编写代码,构建它并不困难。你需要最新的 .NET SDK。
克隆仓库:
git clone https://github.com/par274/sharpemu.git
构建项目:
dotnet build
要通过命令行运行游戏镜像,请使用 PowerShell:
.\SharpEmu "путь_к_eboot.bin" 2>&1 | Tee-Object -FilePath "log.txt"
这个项目适合谁
SharpEmu 在未来几年内不太可能成为你的主要游戏客户端。但它非常适合想要学习的人:
- C# 中的系统编程。
- JIT 编译器和指令转换的工作原理。
- 封闭平台的逆向工程。
该项目看起来"干净"且具有学术性。它没有专有文件或密钥;所有测试都是基于作者个人主机的转储完成的。
SharpEmu 是一个很好的例子,展示了如何使用现代高级语言解决硬件模拟这样的复杂任务。目前,该项目更像是工程师的"沙盒"。如果你对 PS5 中 GPU 命令是如何发送的,或者其内核中的任务调度器如何工作感兴趣,可以看看源代码。阅读 C# 代码显然比弄清楚 C++ 模板的复杂性要容易得多。
你可以在他们的 Discord 社区关注更新,链接在仓库中。开发者们经常在那里分享日志和在加载重型游戏的下一阶段取得成功的消息。
相关项目