跳到正文
PS5PCEM
部分可用固件与 HLE

字体渲染

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

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

字体面、缩放与生命周期

游戏打开一个字体库,用它提供的字节或一次系统字体请求创建字体面,然后询问字形度量和覆盖。每个字体面保持自己的缩放、渲染缩放、倾斜和生命周期。关闭字体库会释放它的字体面,进程拆卸会清除字体状态。字体字节在打开时被复制,因此稍后解除映射游戏的源缓冲区也不会使光栅器失效。

Noto Sans 是替代字体,不是每一种固件字体的逐字节副本。它覆盖拉丁文、希腊文和西里尔文。游戏提供的字体面可以包含其他字形,包括 CJK,这些轮廓会被使用。系统字体请求本身不会替换成一个 CJK 字体面。

字形、字距与图集

字形路径返回真实度量、水平排版、基本的成对字距、抗锯齿覆盖、裁剪和渲染结果描述符。有界的字形缓存避免再次光栅化同一个字符,单独的字距对缓存跨字号复用字距。写入在触及纹理图集之前会检查 CPU 权限,并使 GPU 页监视失效。

字体面不含有的合法 Unicode 标量使用该字体面的 .notdef 轮廓,包括游戏在构建完整图集范围时遇到的控制码。正是这条缺失字形路径让 Jurassic Park Classic Games Collection 能够建完它的字体图集。非法的 Unicode 标量,以及超出范围的显式字形标识符,仍然返回错误。覆盖被写到一到四个字节的像素上。

留给游戏的文本排版

许多游戏从不调用 libSceFont。它们用自己的引擎字体绘制文本,这个实现不会改那些像素。HLE 路径是给那些要求固件来光栅化的游戏的。

文本整形、双向排版、合成字重、CJK 系统字体替换、字体集面选择,以及更高层的 FontWriting 和 String API 都没有实现。针对性检查要通过 zig build test-hle,并加上 font 过滤器。

已经实现的部分

  • 用 FreeType 光栅化游戏提供的 TrueType 和 OpenType 字体面。
  • 系统字体请求在拉丁文、希腊文和西里尔文上的 Noto Sans 回退。
  • 度量、水平排版、成对字距、倾斜、裁剪和字形缓存。
  • 缺失 Unicode 标量时回退到 .notdef,从而放行 Jurassic Park 的图集。

尚未实现的部分

  • 整形、双向排版和 FontWriting API 缺失。
  • 系统字体请求不会替换成 CJK 字体面。
  • 完全用自己的引擎绘制文本的游戏不会走这条路径。

相关机制

这些页面说明什么

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

全部技术