Tilefinch:为 PSP(333MHz、64MB RAM)从零打造的 Web 浏览器
Show HN: Tilefinch – a from-scratch* web browser for the PSP (333Mhz, 64MB RAM)
Tilefinch 是一款在 Sony PSP(333MHz MIPS、64MiB RAM)上从零构建的实验性浏览器,自带布局引擎、QuickJS 运行时与硬件加速视频,无需代理或配套电脑即可运行真实 HTTPS 页面。
为 Sony PSP(333 MHz,64 MB)打造的实验性网页浏览器:从零开始的排版引擎、JavaScript 和硬件辅助视频,全部在掌机本身上运行。
| PSP 分辨率下的 Wikipedia | 360p 视频播放 |
|---|---|
![]() |
![]() |
| 阅读器模式 | 深色模式 |
|---|---|
![]() |
![]() |
| WebGL 游戏 | Danzeff 文本输入 |
![]() |
![]() |
为什么
我大约十年没碰 PSP 了,这次重新拿起它,想找个理由弄清楚三件事:这台机器能被推到什么程度,现代网页有多少能在这般受限的环境里运行,以及如今的编程智能体能做什么。一个网页浏览器正好能检验这三点。
它能做什么
| 功能 | 支持 |
|---|---|
| 网页浏览 | 带 JavaScript、受限 WebAssembly 和 WebSockets、Cookie、图片、移动端布局和 TrueType 文本的真实 HTTPS 页面。不涉及代理或配套电脑。 |
| 原生媒体 | YouTube(通过其轻量级提供方)以及兼容的 HTML <video>/<audio> 元素会在同一个原生播放器中打开。官方构建使用 PSP 固件解码器处理 240p/360p Baseline/Main MP4 和带 AAC-LC 的 240p HLS,包括 YouTube 直播和首播。内置跳转、缓冲状态、首选音频和字幕语言、轨道选择、可续传下载以及纯音频播放。一个可选的、单独构建的解码器增加了 240p H.264 High。 |
| 标签页与导航 | 五个标签页、书签、历史记录、地址和搜索建议、页内查找、可选的会话恢复,以及可选的单标签页休眠。 |
| 广告拦截 | 保守的请求拦截和外观隐藏默认开启。支持自定义 uBlock/EasyList 风格规则和按站点例外。 |
| Cookie 提示 | 常见的同意横幅会被隐藏,无需点击“接受”或创建同意 Cookie;单个站点可以豁免。 |
| 阅读器、基础视图与离线 | 阅读器模式重排文章;基础视图挽救脚本失败的页面,保留其链接、表格和简单搜索表单。保存文章,并安装由小型清单支持、可离线使用的 Web 应用,连同其图标和已加载的同源资源,然后更新、重装或移除它们。 |
| 文本输入 | PSP 系统键盘或更快的 Danzeff 径向键盘,支持从本地书签和历史记录中补全。 |
| 游戏 | 受限的 Canvas 2D 和 WebGL 1,用于图表和适度规模的游戏,支持 ImageBitmap 资源准备、用户启动的 PCM 游戏音频、页面全屏,以及映射到 PSP 控制键的标准 Gamepad API。随附的 Treadline Arena 是一款 3D WebGL 坦克游戏,包含战役、机器人对战、练习场和自适应音乐。 |
| 外观 | 自动或强制页面深色模式、深色和浅色浏览器界面、可下载配色主题、页面文本缩放、翻译后的浏览器菜单、支持阿拉伯语系字形塑造的受限混合从右到左和从左到右布局,以及可选的日语、中文、韩语、西里尔文、扩展拉丁文、阿拉伯文、希伯来文、印地文和彩色 emoji 字形包。 |
| 原生 PSP 界面 | 即时主屏幕、收藏集、时钟、电池和 Wi-Fi 状态、上下文控件、PNG 截图,以及以可拍照二维码形式显示的诊断信息。 |
| 可选的 XMB 重定向 | 配合 ARK-4,Sony 的 Internet Browser 图标可以启动 Tilefinch;按住 L 则打开原始浏览器。 |
| 更新 | 带 A/B 槽位的签名应用内更新、试启动、自动回滚、明确批准,以及可选的已签名早期版本选择器。 |
| 实验性语音搜索 | 一个可选的可下载模型和按需语音引擎。默认关闭;目前速度慢且不准确。 |
概览
| 硬件目标 | PSP-3000:333 MHz MIPS,64 MiB RAM(实测堆约 43 MiB,页面和语音共享 32 MiB 信封),480×272 显示屏,页面和界面使用 RGB565 表面,全屏视频使用 32 位扫描输出 |
| 执行模型 | 网络、HTML、CSS、JavaScript、布局和渲染全部在 PSP 上运行 |
| 浏览器引擎 | Lexbor HTML 解析器,Tilefinch 自有的样式、布局和渲染,QuickJS 运行时 |
| 呈现 | 增量保留显示列表,带有有界 RGB565 瓦片缓存 |
| 网络 | HTTPS 带证书和主机名验证、Cookie、重定向、缓存,以及用于强制门户的隔离 Wi-Fi 登录流程 |
| 许可证 | MIT,第三方组件单独授权 |
工程亮点
| 领域 | 有趣之处 |
|---|---|
| 是浏览器,不是移植 | 样式、布局、绘制、策略、媒体和原生接口层均为原创 C11。Lexbor、QuickJS、curl、Mbed TLS、nghttp2 和 FreeType 以 vendored 方式引入并固定哈希(声明)。它足够像一个浏览器,以至于 chatgpt.com 的未登录聊天——包含一百多个 JavaScript 模块、客户端水合和流式回答——已在 PSP-3000 上端到端运行,这得益于验证性预解析器、作用域样式失效和针对配置文件优化的 JavaScript 引擎(架构)。 |
| 一本严格的内存账本 | DOM、JavaScript、CSS、资源、布局和瓦片共享一个 24 MiB 页面预算。每个表和循环都有界,被拒绝的分配是一条经过测试、可恢复的路径,而不是异常。 |
| 下载结束前就有有用的像素 | 流式 HTML 和 CSS、预加载发现、可恢复布局、可见资源优先、延迟加载的引导模块,以及编译样式和脚本的有界缓存,都旨在 333 MHz 顺序核心上实现首次绘制。 |
| 确定性渲染 | 主机和 PSP 共享相同的布局和光栅化器,直至有序 RGB565 抖动。对照 Chrome 参考测得的保真度下限只能上升(保真度工作流)。 |
| 固件视频加速 | 原始 NAL 桥和有界 H.264 恢复点重写器馈入 PSP 的 Media Engine,两个受保护的解码表面将色彩转换与呈现重叠(媒体状态机)。 |
| 可选双核视频 | 用户构建的附加组件通过将 CABAC、去块、音频和色彩转换交给 Media Engine,同时 CPU 重建行,来解码 240p H.264 High。官方二进制文件有意不包含它。 |
| 480×272 屏幕上的 360p | 640×360 帧作为两条受保护的条带通过 EDRAM,GE 以双线性方式缩放它们,无需逐像素 CPU 处理(设备信封)。 |
| 显式生命周期所有权 | 媒体和网络使用纯 reducer、纪元令牌服务、消费者租约、泵送拆除和隔离,因此内存绝不会在活跃固件或工作线程活动之下被释放(架构)。 |
| 不假装沙箱的安全 | HTTPS 优先导航、CORS、CSP、SRI、私有网络保护、分区感知资源授权、Cookie 控制以及签名 A/B 更新,均在文档化的共享进程模型(安全模型)内强制执行。 |
| 硬件感知门禁 | 优化后的主机套件由 sanitizer、恶意输入、WPT、保真度和 PSP 交叉构建门禁支撑,并对可执行文件大小和热点函数大小设有棘轮限制(工程指南)。 |
详细的性能和内存实验记录保存在本地和私有开发归档中,不在这个公开仓库里。公开的工程文档描述当前契约和可复现的检查。
你需要什么
- A PSP that runs homebrew (custom firmware) and has the 64 MB memory mode:
- PSP-3000:经过测试的型号。本页声称的一切都在它上面运行过。
- PSP-2000 和 PSP Go:相同内存模式,预期可用,尚未验证。
- PSP-1000:不支持。它只有 32 MB 内存,而大多数网站需要更多。
- PSP-E1000(Street):内存够,但没有 Wi-Fi,所以只有离线库能用。不是合理的目标。
- About 20 MB free on the Memory Stick for everyday browsing and updates.
- 可选字形包每个约 1 MB;彩色 emoji 包约 5 MB。除了所选语言包之外,当页面使用其他已安装包的脚本时,Tilefinch 最多可附加两个其他已安装包。如果页面需要你尚未安装的包,会在通知中提供,你可以忽略;从该通知安装时会先显示签名下载大小,然后再次询问。
- 安装可选语音模型时,在已验证下载和新副本共存期间需要额外约 19 MB。如果你想要语音识别,请预留 40 MB 可用空间。
- 一个 PSP 可以加入的 Wi-Fi 网络。使用最新的 ARK-4 自定义固件时,WPA2 可用;否则 PSP 只能加入 WPA(TKIP)或开放网络,这是其硬件时代的限制。大多数路由器可以提供 WPA/TKIP 访客网络。请先在 PSP 自带的网络设置中保存连接。
安装
- 从最新的 Tilefinch 发布版下载 PSP 安装
.zip。 - 解压它,并将整个
TILEFINCH文件夹复制到记忆棒上的PSP/GAME/。启动器最终应位于PSP/GAME/TILEFINCH/EBOOT.PBP,旁边有slot-a、slot-b、data和NOTICES。 - 安全断开 PSP,然后从 Game → Memory Stick 启动 Tilefinch。
- 如果尚未保存,请在 PSP 的网络设置中保存一个 Wi-Fi 连接。Tilefinch 使用连接配置文件 1,除非你在 Settings → Device & storage 中选择另一个。
发布页面上的 .tfum 和 .tfup 文件用于 Tilefinch 的签名应用内更新器,不用于手动安装。可选的语言、emoji 和语音组件从其设置屏幕安装。
可选的 ARK-4 XMB 重定向
ARK-4 用户可以让 Network → Internet Browser 打开 Tilefinch。这是一个可选的 VSH 插件:它不修改 PSP 固件或 flash0,不在后台轮询任何内容,也不向记忆棒写入任何内容。
- 正常将 Tilefinch 安装到
PSP/GAME/TILEFINCH/。 - 将安装归档中的
TILEFINCH/OPTIONAL/tilefinch_xmb.prx复制到ms0:/SEPLUGINS/tilefinch_xmb.prx。 - 在 ARK 的 Custom Launcher 或 Plugin Manager 中,为 VSH (XMB) 运行级别安装或启用该插件。
- 重启 VSH 或重启 PSP。
ARK 的 PLUGINS.TXT 中等效的手动行是:
vsh, ms0:/SEPLUGINS/tilefinch_xmb.prx, on
在使用内部存储的 PSP Go 上,两条路径中都使用 ef0:。
- 打开 Internet Browser 图标时按住 L 可进入索尼的浏览器。由于重定向为此使用了 L,Tilefinch 的上一版本安全启动仅在从 Game → Memory Stick 启动 Tilefinch 时可用。
- 如果 Tilefinch 缺失或交接失败,Sony 的浏览器会保持打开。
- 要恢复原始行为,请在 ARK 的 Plugin Manager 中禁用该插件并重启 VSH。
Tilefinch 仍作为普通的自制应用程序运行,而不是 VSH 内部的代码,因此让它保持加载会重新加载 XMB,并可能显示常见的 Sony 或 ARK 启动画面。替换插件文件本身后,请将 PSP 完全关机并冷启动:Restart VSH 可能会在内存中保留之前的 NO_STOP 处理程序。该重定向会启动 Tilefinch 的稳定根启动器,因此签名更新、试用启动和自动回滚都能照常工作。ARK-4 的 插件文档 介绍了其 Plugin Manager 和 PLUGINS.TXT 格式。
可选 H.264 High 解码器
官方发行版不重新分发自定义的 H.264 和 AAC 解码器。兼容的 Baseline/Main MP4 和 HLS(包括直播流)继续使用 PSP 的固件。要添加 240p High-profile 路径,请按照 可选 PSP 软件解码器 从其固定上游源码构建该附加组件,然后将其三个文件复制到 PSP/GAME/TILEFINCH/components/swdec/。
该目录位于两个应用槽之外,因此签名更新会保留该附加组件。更新元数据会记录解码器 ABI:如果未来的更新更改了它,更新屏幕会显示 Decoder rebuild needed。当页面需要该附加组件而它缺失或不兼容时,播放器会指向这些构建说明,而不是报告一般的视频故障。
控制
| 按钮 | 操作 |
|---|---|
| 方向键 | 在链接和控件之间移动焦点(按住可重复) |
| 摇杆 | 移动页面光标;将其按住顶部或底部边缘可滚动(设置可切换为直接滚动) |
| X | 激活聚焦的项目,或在光标下点击 |
| Circle | 返回,或取消当前加载 |
| Square | 重新加载(当 Experimental Voice 开启时,在文本字段上启动语音输入) |
| Triangle | 显示或隐藏浏览器界面 |
| Start | 地址和搜索栏 |
| Select | 菜单:Home、Tabs、Page tools、Library、Settings、Help & diagnostics、Exit to XMB |
| Start + Select(同时按住) | 将控制权交给页面的 JavaScript;再次按住可收回 |
| L / R | 上一页 / 下一页 |
| 启动时按住 L | 安全启动:启动上一个版本(在安装更新后) |
在地址栏中输入 URL 以前往该地址,或输入其他内容进行搜索。
使用 Tilefinch
用户指南 详细介绍了日常使用:
- 输入 可使用 PSP 键盘或更快的 Danzeff 布局,并从书签和历史记录中补全。
- 页面内查找 位于 Menu → Page tools。
- 阅读器模式、用于脚本失败页面的 Basic view,以及保存的文章和视频下载的 离线库。
- 游戏和页面控制:将按钮交给页面的 Gamepad API、全屏、游戏音频和直接多人游戏。
- 截图、Tilefinch 在 页面无法加载时 提供的功能,以及针对 JavaScript、广告拦截、Cookie 通知和存储的 按站点控制。
语言支持
浏览器菜单
打开 Settings → Appearance → Language & emoji → Interface language。 用左/右键选择,按 X 安装,然后重启 Tilefinch 以应用。 英语是内置的;可下载的翻译包括西班牙语、 法语、德语、日语、俄语、乌克兰语、简体中文、韩语、 印地语和阿拉伯语。选择一种语言还会下载其所需的字形包 (如果尚未安装)。尚未翻译的高级消息仍保留 英文,如果下载失败,英文仍然可用。
这会更改 Tilefinch 的菜单——而不是网站、游戏或字幕的文本。 首选视频、音频和字幕语言是单独的设置。
页面文本和表情符号
内置字体覆盖拉丁文本,并为部分中文、 日文、韩文和表情符号字符提供紧凑的备用字体。Settings → Appearance → Language & emoji 提供额外的页面文本包:日语、简体中文、 繁体中文、韩语、西里尔文(包括俄语和乌克兰语)、 扩展拉丁文、阿拉伯语、希伯来语和天城文(印地语),以及一个彩色表情符号包。 使用缺失包的页面还可以在您浏览时提供安装该包的选项。
确认相应的包下载并重启以使用它。方块键可移除 已安装的包。包增加字形覆盖范围;它们不会翻译页面文本。 阿拉伯语和希伯来语支持从右到左的布局。印地语覆盖常见 音节和界面组合;不常见的连字可能仍使用备用 字形。
翻译和签名包托管在 tilefinch-models 中,其中列出了 可用的下载。Tilefinch 在安装前会验证它们,并将 已安装的下载保存在记忆棒上以供离线使用。有关安装、移除和缺失文本通知,请参阅 语言包指南。
更新
从 Settings → Updates 检查更新。可选的背景检查 最多每周查找一次新版本信息,并且可以关闭; 除非您要求,Tilefinch 绝不会下载或安装更新。
- 稳定版和测试版发布均经过加密签名并在安装前 验证。开发者通道(您必须明确选择)未签名,并信任您配置的端点。
- 新版本会安装到第二个槽位,并作为试用版启动。如果它 无法正常启动,启动器会返回到之前可用的版本, 并且在启动时按住 L 键始终会启动上一个版本。
- 在稳定版上,在更新页面按方块键可选择较旧的已签名 版本。它会安装到非活动槽位,并且必须通过相同的试用 启动。
docs/SECURE_UPDATES.md 和 SECURITY.md 中有详细信息。
隐私
- 无遥测、分析或账户。Tilefinch 不会将关于您或 您浏览的任何信息发送到任何地方。对 YouTube 的请求会携带配置的视频 语言(默认为 PSP 的语言),以便结果和音轨可以 本地化。
- 浏览器保留的所有内容都留在 PSP 上。Cookie 仅存在于内存中, 关机后即消失;历史记录(默认关闭)、缓存、保存的页面 和视频、截图以及设置都在您的记忆棒上。 Settings → Device & storage → Site data & storage 列出了持有数据的 站点,并可以清除其中一个站点,或清除所有站点的 HTTP 缓存、Cookie、本地 存储和会话存储。
- 站点存储(
localStorage、sessionStorage以及源私有文件系统)驻留在 RAM 中,除非你选择,否则不会写入 Memory Stick。当站点超出 RAM 容量时,Tilefinch 会先询问是否将该站点的数据保留在 Memory Stick 上——仅本次会话或始终保留——并显示所需空间大小。Permissions & controls → Site storage 按站点设置该选择,而 Site data & storage 则为任何已列出的站点设置。 - 为了更快地重新连接,Tilefinch 通常会将服务器签发的短期 TLS 恢复票据保存在
data/tls-sessions.bin中。它们相当于凭据,因此会留在你的 Memory Stick 上,只会发送回签发它们的站点,并可通过 Site data & storage → Clear HTTP caches 清除。Settings → Privacy & security → TLS ticket saving 可停止在启动之间保留它们,同时不会禁用会话内的连接重用。 - 如果启用,后台更新检查每周最多联系一次 GitHub releases API。它比较版本号,除普通 HTTPS 请求外不发送任何可识别信息,并且可以关闭。你请求的下载——包括更新、语言包和界面翻译——也会联系其公布的下载主机。
- Help & diagnostics → Check Wi-Fi sign-in 会向
connectivitycheck.gstatic.com发出一次无 cookie 的 HTTP 请求,仅在你要求或接受登录建议时进行。检测到的登录页面会使用临时 cookie 和存储打开,关闭时即被删除。 - 在起始页上,将光标停留在内置 YouTube 磁贴上约三分之一秒,会在后台打开与 YouTube 的连接,这样当你按下 X 时该站点已准备就绪。这仅针对该内置磁贴,绝不会针对书签或页面提供的地址。它发送一个无正文请求,不带 cookie、凭据或 referrer,并且在你打开该站点之前不获取任何内容。此类连接最多存在一个,一旦你移开或 PSP 挂起就会立即关闭。
- 语音搜索完全在 PSP 上运行;音频绝不会离开设备。
安全
安全模型记录了 Tilefinch 的安全默认值、兼容性控制、威胁模型和已知隔离限制。
已知限制
- 许多站点渲染不完美,一些重型站点完全无法加载;Tilefinch 尚未实现所有 Web 标准或 API。超出内存预算的页面会降级或停止加载,而不是崩溃。
- 重型 JavaScript 应用在 333 MHz CPU 上运行缓慢。在 PSP-3000 上,chatgpt.com 大约需要 40 秒才能开始输入,发送后简短回复又需要大约同样长的时间(根据录制会话测量;实时网络时间会使两者都增加)。
- YouTube 支持取决于 YouTube 不变;它偶尔会失效,更新会修复。Tilefinch 不生成 YouTube Proof-of-Origin (PO) 令牌,因此即使浏览和搜索可用,需要该令牌的视频也可能无法观看。
- 语音搜索是实验性的:速度慢、经常出错,且仅支持英语。
- 标签页为每个页面的历史、URL、焦点和滚动位置保留有界记录,而不是五个完整页面,因此切换标签页会通过共享缓存重新加载页面。切换器为每个标签页保留一个 60×34 的预览(总共约 20 KiB),取自已经渲染过的帧。可选的 Hibernate tab 默认关闭,会将一个非活动标签页的快照(而非其页面内存)移至 Memory Stick 并标记为
[Z]。 - 受 Cloudflare 托管挑战保护的站点无法使用。
- WebGL 是 PSP 的 GE 在常规顶点颜色和纹理着色器方面的有界子集,而不是完整的可编程 GPU。复杂着色器、透明绘制缓冲区、离屏帧缓冲区和大型场景会温和失败,而不是消耗无界的内存或帧时间。
- 没有桌面级进程沙箱,也没有完整的 CSP。Tilefinch 强制执行响应头 CSP、资源和框架策略的有界子集,对脚本和样式表实施子资源完整性,并限制 iframe 沙箱和源边界(参见安全模型),但它不会在独立进程中隔离源。请勿将其用于敏感账户或交易。
报告问题
如果出现问题,请先查看 TROUBLESHOOTING.md。有用的错误报告包括:
- PSP 型号和自定义固件(例如“PSP-3000, ARK-4”);
- 来自 Help & diagnostics → Version & system 的 Tilefinch 版本;
- 网站或 URL,以及你按了什么;
- 崩溃后,来自 Memory Stick 的
PSP/GAME/TILEFINCH/data/tilefinch-crash.txt(512 字节的全零文件表示未记录到崩溃)。
如果无法方便地访问 Memory Stick,Help & diagnostics → Diagnostic QR 会以可拍照的 QR 页面显示相同的有限日志。对于疑似安全问题,SECURITY.md 说明了该项目保护什么以及如何报告。
从源代码构建
桌面实验室在你的计算机上以 PSP 屏幕尺寸和内存配置构建并测试同一引擎。首次配置会下载哈希固定的依赖项;主机构建需要 libcurl 开发头文件和 zlib。
cmake --preset release cmake --build build-preset-release ctest --test-dir build-preset-release
docs/DEVELOPMENT.md 包含完整工作流程;在发送更改之前,请阅读 CONTRIBUTING.md。
工作原理
一个引擎到处运行。解析、样式、布局、脚本和基于瓦片的渲染都是有界的,并计入内存预算,其设计使得被拒绝的分配、格式错误的页面或取消都是正常事件,而不是崩溃。docs/ARCHITECTURE.md 包含系统图、内存契约和生命周期边界,docs/README.md 映射了所有文档,包括 docs/engineering/ 中的工程手册。
正在评估工程实现?请按以下顺序阅读:
- ARCHITECTURE:系统及其所有权规则。
- SECURITY_MODEL:哪些会安全失败,以及哪些保证不存在。
- 两个设备生命周期契约,分别针对媒体和网络。
- 设备资格策略:主机、模拟器和硬件各自能证明哪些声明。
- RELEASE_PROCESS:门禁、棘轮和离线签名仪式。
贡献
欢迎提交问题和拉取请求。Tilefinch 是一个业余项目,因此回复和审查可能需要一段时间。CONTRIBUTING.md 描述了构建和测试的期望。
许可证与独立性
Tilefinch 采用 MIT 许可证;参见 LICENSE。第三方组件保留自己的许可证和声明,列在 THIRD_PARTY_NOTICES.md 中。安全策略和漏洞报告见 SECURITY.md。
浏览器下载不包含声学模型或语音词典。如果你在应用中请求可选的语音组件,其签名包会在模型旁边附带 Alpha Cephei 和 CMUdict 许可证文件;浏览器捆绑包本身则附带其链接解码器所需的 PocketSphinx 许可证。
可选的日语、中文、韩语、西里尔字母、扩展拉丁字母、阿拉伯语、希伯来语、天城文(印地语)和彩色表情符号包同样不包含在下载内容中。它们由 Noto 字体生成,附带完整的 SIL Open Font License 声明和源字体摘要,仅在你主动请求时才会获取。Tilefinch 不读取 PSP 的专有固件字体。
Tilefinch 是一个独立、非官方的自制软件项目。它与 Sony Interactive Entertainment 无关联,未获其赞助或认可。PlayStation、PSP 及相关标志归各自所有者所有。本项目不包含任何索尼专有 SDK 材料、固件、美术资源或品牌标识。
维基百科截图展示的是英文条目“PlayStation Portable”。维基百科文本采用CC BY-SA 4.0许可。Wikipedia 及其标志是 Wikimedia Foundation 的商标,此处仅用于说明浏览器兼容性;Tilefinch 与 Wikimedia Foundation 无关联。
视频截图展示的是 Big Buck Bunny 中的一帧,版权 2008 Blender Foundation,采用CC BY 3.0许可。该影片及其演职员名单可从Blender 开源电影项目获取。
来源:Hacker News · github.com





