跳到正文
PS5PCEM

实现

PS5PCEM 如何工作

每一页对应模拟器真正运行的一种机制:主机做什么、Zig 代码做什么,以及还有什么没有实现。

仓库笔记截至 2026年10月30日

固件与 HLE

HLE 是 PS5PCEM 应答游戏所导入固件调用的方式。每个数字 NID 都成为主机栈上的一个 Zig 函数,并在 Windows 上保留客户机的 System V 调用约定。

工作方式

AMPR 计数器

部分可用

PS5PCEM 中的 AMPR 是游戏机计数器与完成命令的进程本地软件模型。一百二十八个计数器按提交顺序接受存储、字段的原子更新、成对读取和带掩码的等待。

工作方式

APR 把游戏文件解析一次,之后在后续命令缓冲区里携带一个进程本地标识符。延迟的 AMPR 读取会重新打开同一个只读的 /app0 文件,而不必永远持有主机描述符。

工作方式

客户机地址就是真实的主机地址。直接内存是映射进这块空间的稀疏共享物理池,MemoryPool 在同一后备之上增加预留、提交和批处理操作。

工作方式

存档

可用

挂载后的存档位成为可写的 /savedata0。游戏使用普通文件 API,下次启动会在游戏所公布的产品代码下找到同一批文件。

工作方式

字体渲染

部分可用

libSceFont 用 FreeType 光栅化游戏提供的 TrueType 和 OpenType 字体面。系统字体请求使用随附的 Noto Sans 替代字体,覆盖拉丁文、希腊文和西里尔文。

工作方式

PNG 编码器把带行跨距的 RGBA 或 BGRA 像素写成 8 位 RGB 或 RGBA 文件。解码器把非交错的灰度、调色板、RGB 和 RGBA 图像读进经过检查的客户机缓冲区。

工作方式

实时时钟

部分可用

RTC 检查日历字段,转换 Windows FILETIME,并对 tick 做经过检查的算术。客户机看到的是一台连贯的时钟,没有主机的夏令时换算。

工作方式

在 Windows 上,每一个 libSceFiber 纤程都是真实的 Windows 纤程,因此切换会保留客户机寄存器和客户机栈。用户级线程经由同一条 pthread 路径启动。

工作方式

内核 AIO API 接受一批读取并返回一个标识符。PS5PCEM 在提交时执行这批读取,接口允许这样做,游戏随后取回一个已经完成的结果。

工作方式

图形

PS5 游戏在自己的内存里构建 GPU 包并提交这块缓冲区。PS5PCEM 解码这条 PM4 流,保持寄存器状态,并按顺序执行绘制和分派。

工作方式

PlayStation 5 着色器是 RDNA2 机器码。PS5PCEM 解码 GFX10 各族,建立控制流图,并把受支持的操作降为供 Vulkan 使用的 SPIR-V 1.5。

工作方式

合并后的 NGG 顶点程序,包括以 S_SETPC_B64 继续的 fetch 着色器,作为一个图形阶段来翻译。导出程序保留自己的用户数据窗口。

工作方式

IMAGE_LOAD 的 BY2、BY4、PCK2 和 PCK4,包括显式 mip 形式,对已测量的原生 2D 格式执行。BY 加载返回连续纹素。PCK 加载把它们的原始位打包进一个寄存器。

工作方式

水平 gather

部分可用

IMAGE_GATHER4H 和 IMAGE_GATHER4H_PCK 在一组水平纹素上采集一个通道。已测量的直接 1D 和 2D 子集由 1,242 次 GPU 分派覆盖。

工作方式

S_SWAPPC_B64 和 S_CALL_B64 保存完整的返回地址,并运行一个有界的局部子程序,包括位于 ENDPGM 之后的被调用者。经过验证的 AGC fetch 着色器可以按同样的方式链接。

工作方式

Vulkan 后端在运行时加载驱动,要求 Vulkan 1.2,并通过交换链呈现客户机帧。渲染目标、存储图像和管线在多次绘制之间保持常驻。

工作方式

Direct3D 12 后端

部分可用

0.3.6 版本提供 Windows 实验性原生 DirectX 12。Terminator 2D 到达实机游戏,Raiden IV 到达首个关卡,Super Woden GP 到达地图。Vulkan 仍为默认,Linux 使用 Vulkan。

工作方式

MSAA

部分可用

匹配的 2×、4× 和 8× 颜色与深度采样数留在主机图像上,稍后才解析。Asterix 用这条路径处理 MSAA 深度和模板,从而去掉了一次很大的意外回读。

工作方式

HTILE、DCC、CMASK 和 FMASK 是游戏机的压缩深度与颜色元数据。PS5PCEM 跟踪这些指针,在它理解的情形下清除 HTILE,并拒绝一种否则会被错误解块的布局。

工作方式

纹理解块

部分可用

PS5 纹理按 GFX10 交织模式存放,而不是线性的行。PS5PCEM 在 CPU 上应用地址方程,并对符合条件的大型 4、8 和 16 字节表面在 GPU 上应用。

工作方式

GPU 页跟踪器

部分可用

可选启用的页跟踪器监视 16 KiB 客户机页。第一次原生 CPU 存储会触发故障,推进一代,并使 GPU 副本失效,这样未改变的页就不会每一帧都被哈希并上传。

工作方式

VideoOut

可用

VideoOut 注册客户机的显示缓冲区,并且只在呈现回调接受该帧之后才完成一次翻页。主机窗口是 1080p SDR 的 Vulkan 交换链。

工作方式

音频与视频

AudioOut

可用

AudioOut 在 Windows 设备上以 48 kHz 播放客户机 PCM。旧式端口有自己的流和队列,因此音乐和音效一起播放,欠载之后仍保持采样顺序。

工作方式

ACM 卷积

部分可用

ACM 卷积在 CPU 上运行 FMOD 的分段混响。共享输入的批次变换一路干信号,应用浮点或半精度浮点的冲激响应分段,并把湿结果重叠相加。

工作方式

AJM 编解码器

部分可用

AJM 解码 ATRAC9、MP3、MPEG-4 AAC 和 Opus。每个编解码器实例保持自己的状态,未知编解码器会被拒绝,而不是被报告为静默的成功。

工作方式

NGS2

部分可用

NGS2 保持系统、rack 和 voice 句柄,解析普通的 RIFF/WAVE 数据,并把静音的 48 kHz 颗粒按节奏推进,使软件 DSP 工作线程不能空转。voice 合成本身并不完整。

工作方式

AvPlayer

可用

SceAvPlayer 用 FFmpeg 把影片容器解码到游戏拥有的 NV12 帧和 48 kHz 立体声 PCM。即使游戏从未读取其中一条流,播放也会在源时长过去时结束。

工作方式

CPU、加载器与工具

在 Windows x86-64 上,客户机的机器码直接运行。每个客户机 pthread 由一个主机工作线程承载,每次阻塞调用之后都会恢复 FS 基址,因为 Windows 不保留它。

工作方式

加载器映射已解密的 PS5 SELF 和裸 ELF64 模块,应用重定位,并对照 HLE 登记表解析导入。游戏随后收到它自己启动的模块的稳定句柄。

工作方式

DualSense、DualSense Edge 和 DualShock 4 经 HID 读取,USB 和 Bluetooth 都可以。兼容 Xbox 的手柄使用 XInput。键盘通过启动器配置映射到摇杆。

工作方式

PKG 解包器

部分可用

pkgextractor 解包开发中观察到的调试 FPKG 布局:外层包、内层 PFS、NAPS 名称映射,以及 Kraken 压缩的载荷。加密的零售包不在范围内。

工作方式

这些页面说明什么

文字依据 PS5PCEM 仓库中的架构说明和 2026 年 10 月的报告。单项测试通过并不等于新的帧率,也不等于新的通关。