RPCS3 自动更新一次到底做了什么?3 个触发方式、5 步链路、全平台差异一次讲清
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是否查、查完是否自动装取决于你在设置 → 常规里选的模式。手动查。菜单里那个检查更新选项点一下就走automaticfalse的分支只查不装装不装由你点。后台静默查。启动时选了后台模式或你正用命令行直接拉起游戏CLI 启动它就会躲到后台去查不打扰你发现更新才冒泡提醒。那四种启动模式对应 gui_settings.h 里的四个取值你选的模式启动时行为发现更新后开启正常查弹窗问你装不装自动正常查不问直接下载安装后台躲后台查只提醒不弹窗打断关闭不查——记住这张表后面翻车排查会反复用到它很多时候没更新只是因为你选了关闭或后台。一次更新的完整旅程5 步走完把check_for_updates内部拆开你发起一次更新会经历这么一条线第 1 步 · 问服务器我落后了多久。它会带着当前构建的提交号、系统类型、架构、系统版本号去请求 RPCS3 的更新接口。服务器回一段 JSON里面最关键的三个字段是当前版本、最新版本、以及每个平台对应的下载地址、文件大小、校验和。第 2 步 · 判要不要动。如果服务器说你已经最新就到此为止手动查时还会弹窗告诉你已是最新。如果落后了它会算出你比最新版晚了多久并顺带把更新日志每条带 PR 号拉下来准备塞进那个确认对话框。第 3 步 · 问你一句除非选了自动。非自动模式下会弹一个带更新日志和本版本不再提示复选框的对话框。你点否它会记一笔这个版本别再问直接结束。第 4 步 · 下载 两道安检。真正的更新包通过 downloader 拉下来落地前先过两关一是大小对不对二是SHA256 校验和跟服务器给的一致不一致。任何一关不过直接判定失败不会往下装。第 5 步 · 替换、记档、重启。校验过了就开始换文件平台不同做法不同下一节细讲。换完往配置目录写一条update_history.log记从 X 版本升到 Y 版本然后优雅关停当前进程、立刻拉起新版本整个过程带一个--updating标记。一个容易被忽略的细节装之前它先确认模拟器有没有在跑。你要是正在打游戏它会拦下来提醒你先停掉模拟再更新避免文件被占用换不掉。不同平台不同的玩法同一个下载校验流程到了怎么把新文件落盘这一步三个平台各走各的路。差异主要在这维度LinuxWindowsmacOS更新单元单个 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 能直接告诉你卡在网络、服务器维护还是本地校验哪一环省掉瞎猜。高频疑问 QA问为什么我每次启动都没提示更新多半是更新模式被设成了关闭或者你是 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),仅供参考