RPCS3 自动更新一次到底做了什么?3 个触发方式、5 步链路、全平台差异一次讲清
【免费下载链接】rpcs3PlayStation 3 emulator and debugger项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3
打开 RPCS3,主窗口刚出现就悄悄去查了一趟新版本——这就是RPCS3 自动更新在后台干的活。整个过程你几乎察觉不到:它先问服务器"我落后了吗",再决定要不要弹个窗,最后下载、校验、替换、重启一条龙。这套逻辑集中在rpcs3qt目录里,读源码比看猜测靠谱。下面不堆代码,把"它什么时候动手、动手后发生了什么、出了岔子怎么排查"按时间线捋一遍,让你真正看懂 RPCS3 的自动更新是怎么跑的。
更新机制长什么样:它盯着哪几个开关
RPCS3 的自动更新由一个叫 update_manager 的组件负责,真正的网络活交给一个基于 curl 的 downloader。它一共在三个时机出手,全都走同一个入口check_for_updates:
- 启动时自动查。主窗口第一次显示时触发(见 main_window.cpp),是否查、查完是否自动装,取决于你在"设置 → 常规"里选的模式。
- 手动查。菜单里那个"检查更新"选项,点一下就走
automatic=false的分支,只查不装,装不装由你点。 - 后台静默查。启动时选了"后台"模式,或你正用命令行直接拉起游戏(CLI 启动),它就会躲到后台去查,不打扰你,发现更新才冒泡提醒。
那四种启动模式,对应 gui_settings.h 里的四个取值:
| 你选的模式 | 启动时行为 | 发现更新后 |
|---|---|---|
| 开启 | 正常查 | 弹窗问你装不装 |
| 自动 | 正常查 | 不问,直接下载安装 |
| 后台 | 躲后台查 | 只提醒,不弹窗打断 |
| 关闭 | 不查 | —— |
记住这张表,后面"翻车排查"会反复用到它:很多时候"没更新"只是因为你选了"关闭"或"后台"。
一次更新的完整旅程:5 步走完
把check_for_updates内部拆开,你发起一次更新会经历这么一条线:
第 1 步 · 问服务器"我落后了多久"。它会带着当前构建的提交号、系统类型、架构、系统版本号去请求 RPCS3 的更新接口。服务器回一段 JSON,里面最关键的三个字段是:当前版本、最新版本、以及每个平台对应的下载地址、文件大小、校验和。
第 2 步 · 判"要不要动"。如果服务器说"你已经最新",就到此为止(手动查时还会弹窗告诉你"已是最新")。如果落后了,它会算出"你比最新版晚了多久",并顺带把更新日志(每条带 PR 号)拉下来,准备塞进那个确认对话框。
第 3 步 · 问你一句(除非选了自动)。非自动模式下会弹一个带"更新日志"和"本版本不再提示"复选框的对话框。你点"否",它会记一笔"这个版本别再问",直接结束。
第 4 步 · 下载 + 两道安检。真正的更新包通过 downloader 拉下来,落地前先过两关:一是大小对不对,二是SHA256 校验和跟服务器给的一致不一致。任何一关不过,直接判定失败,不会往下装。
第 5 步 · 替换、记档、重启。校验过了就开始换文件(平台不同做法不同,下一节细讲)。换完往配置目录写一条update_history.log,记"从 X 版本升到 Y 版本",然后优雅关停当前进程、立刻拉起新版本,整个过程带一个--updating标记。
一个容易被忽略的细节:装之前它先确认"模拟器有没有在跑"。你要是正在打游戏,它会拦下来提醒你"先停掉模拟再更新",避免文件被占用换不掉。
不同平台,不同的玩法
同一个下载校验流程,到了"怎么把新文件落盘"这一步,三个平台各走各的路。差异主要在这:
| 维度 | Linux | Windows | macOS |
|---|---|---|---|
| 更新单元 | 单个 AppImage | 一整个 7z 包 | 一整个 7z 包 |
| 落地方式 | 把旧 AppImage 改名成_old,原地写新的 | 解包到目录,被占用的文件先挪开再覆盖 | 解包到临时目录,再调脚本替换 |
| 特殊处理 | 给新文件补上可执行权限 | 用rpcs3_old/暂存活跃文件 | 恢复文件权限、支持软链接 |
| 重启方式 | 直接execv拉起新 AppImage | 用_wexecl重启 | 跑内置的update_helper.sh脚本 |
也就是说,只有 Linux 的 AppImage 才走"自动更新"这条路。代码里写得很直白:启动自动检查时,如果不是 AppImage(没设APPIMAGE环境变量),它连查都懒得查,直接记一条日志跳过。你若是从源码自己编译出来的版本,启动时也会跳过自动查——这是为了别让"开发版"和"稳定版"互相打架。想在自己的构建上调试自动更新,得改 update_manager.cpp 里那个allow_local_auto_update开关(默认是关的,注释里就写了"本地调试自动更新器时设成 true")。
一句话记:Linux 换整个镜像,Win/mac 解包换文件,但大家共享同一套下载 + 校验 API,更新信息口径一致。
更新翻车了?按这个顺序排查
别上来就重装,按下面这条由浅到深的路径走,绝大多数问题能定位到:
先确认它"该不该动手"。打开设置看更新模式是不是被设成了"关闭"。如果你用的是 Linux 非 AppImage 版,或者自己编译的本地构建,启动时根本不会触发自动查——这是设计如此,不是故障。手动从菜单点"检查更新"应该还能走通;如果连菜单都提示"你的系统暂不支持自动更新器",说明你这构建压根没编译进更新功能。
再看网络与写入权限。更新分两次网络往返(查信息、下包),任何一次断网都会报"更新过程中出错,查看日志"。重点翻 update_manager.cpp 写下的UPDATER通道日志,它会区分是"没找到 Hash(自定义/PR 构建)"还是"服务器在维护"。日志里如果写着"临时文件创建失败"或"没权限写入",那就是目录权限或磁盘空间的问题——检查临时目录可写、检查剩余空间够不够放一个完整更新包。
然后看是不是"被占用"卡住。更新前必须停掉模拟。Win/mac 解包时会先把正在被占用的文件挪到rpcs3_old/再覆盖,挪不动就会失败;所以更新前把 RPCS3 彻底停干净、别开着游戏列表占着资源。
最后才是回退。如果你升到某版本后发现不对劲,配置目录里的update_history.log记着每次"从 X 到 Y",能帮你确认到底换成了哪个版本。老版本文件(_old或rpcs3_old/)在成功替换前仍留着,可用于手动救回。
安全底线:你的数据谁来护
自动更新最怕两件事:换到坏文件、弄丢你的东西。RPCS3 在这两处各留了一道门:
- 换文件前有安检。校验和(SHA256)和文件大小双校验不过,就中止,绝不把可疑包往盘上写。下载地址还做了前缀白名单校验,防止被指到乱七八糟的站点。
- 坏版本能被"往回拉"。如果服务器把你现在这个版本标记成"有 bug 不再提供",检测时会算出负的时间差,弹窗措辞会直接变成"有更好的版本可用",引导你降级回稳定版——这是它内置的一种降级保护。
- 你的用户数据不在这次动刀范围内。更新只替换程序本体(可执行文件 / AppImage),你的配置、存档、输入映射、着色器缓存放的是独立的配置目录,不在替换路径里。这就是为什么"更新失败"通常不会连累你的存档。
- 每一步都留痕。
update_history.log记录版本变迁,UPDATER日志记录每次检查/下载/校验/替换的结果,出问题时有据可查。
简单说:它换的是"程序",不碰"你的东西",而且换之前先验货。
榨干更新的每一分性能
RPCS3 的自动更新流程是固定的,但你仍然能在"用得顺手"上做几件事:
- 给启动模式选个对的位置。嫌启动时多查一遍慢,就选"后台";想省心就选"自动";只想偶尔手动弄一次,选"关闭"再手动点。别为了"快"直接关掉——那样你就错过了坏版本的降级提醒。
- 更新前先停模拟、清磁盘。这能同时避开"文件被占用"和"临时目录写不下"两类最常见的失败,比事后救火省事得多。
- 不想被某个版本烦,就勾"本版本不再提示"。它会把版本号存进设置(
infoBoxSkipVersion),下次启动自动跳过同一个版本的提醒,不会反复弹。 - 盯着
UPDATER日志。真出问题时,日志里的 return code 能直接告诉你卡在"网络"、"服务器维护"还是"本地校验"哪一环,省掉瞎猜。
高频疑问 Q&A
问:为什么我每次启动都没提示更新?多半是更新模式被设成了"关闭",或者你是 Linux 非 AppImage / 本地编译构建,启动时按设计就不会自动查。想让它动,要么改模式,要么手动从菜单点"检查更新"。
问:日志里出现"Hash not found (Custom/PR build)"是坏事吗?不一定是坏事。它只是说明你当前是自定义或 PR 构建,服务器查不到它的 Hash。手动点检查更新时,它会问你要不要直接跳到最新正式版;你不确认就不会动。
问:更新到一半失败了,我的存档还在吗?在。更新只替换程序文件,不碰配置目录里的存档和设置。失败后老程序文件在替换完成前仍留着,可以救回;确认一下update_history.log看它停在哪一步即可。
问:"自动"模式和"手动检查"有什么本质区别?"自动"是启动时不问你就下载安装;"手动检查"是你点才查,查完只告诉你"有/没有新版本",装不装由你。二者共用同一套下载与校验逻辑,区别只在"谁来按那个确认键"。
问:我能强制回到上一个版本吗?它没有一键回滚按钮,但会记历史(update_history.log),且坏版本会被服务器标记、反过来引导你降级。想精确回某版本,最稳妥是按历史记录确认版本,再手动换回对应的发布包。
RPCS3 的自动更新,本质就是"查→问→下→验→换→重启"一条线,外加平台各自一套落盘办法。看懂这条线,你就能判断它该不该动、卡在哪、坏了怎么救。下一步,不妨顺着 update_manager.cpp 把handle_json和handle_rpcs3两个函数读一遍——前一个是"判断要不要更新",后一个是"把文件真正换掉",读完你对这套机制的理解就从"知道它怎么跑"升级到"能改它怎么跑"了。
【免费下载链接】rpcs3PlayStation 3 emulator and debugger项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考