资讯动态

几分钟看懂 Checkpoint 存档管理:3DS 与 Switch 备份框架的内部机制完整解析

发布时间:2026/8/24 2:40:22 来源:尧图企业网站定制
几分钟看懂 Checkpoint 存档管理3DS 与 Switch 备份框架的内部机制完整解析【免费下载链接】CheckpointFast and simple homebrew save management framework for 3DS and Switch.项目地址: https://gitcode.com/gh_mirrors/ch/CheckpointCheckpoint 是跑在 3DS 和 Switch 上的 C 自制存档管理框架它自动识别机器里哪些游戏有存档把备份、恢复、无线传输、FTP 访问都收进一个轻量图形界面里还支持往 SD 卡里丢 C 脚本扩展能力。对想在两台主管理存档的玩家以及好奇一个掌机小应用怎么做到又快又稳的开发者这份解析会带你从用户界面一路走到线程内部。从存档没有官方备份说起Switch 上没有官方云存档3DS 的卡带存档位置又五花八门玩家想留底基本靠手动翻目录麻烦还容易翻错。市面上的备份工具大多依赖手工维护的标题列表游戏一更新就可能漏存档。Checkpoint 换了个思路标题全部自动探测过滤不靠外部列表备份恢复这类耗时操作一律丢给后台线程界面全程不卡它不只是个应用还是个框架应用能对存档做的每件事都能被 SD 卡上的一个 .c 脚本复现内置的 sharkive 改档脚本和 googledrive 同步脚本就是按这条路写的。用户视角一次备份和恢复是怎么走的启动后主屏幕就是一张游戏网格带图标、名称和存档状态3DS 版用上下屏分别展示列表与详情Switch 版手持 720p、底座 1080p 自适应。选中一个游戏后弹出操作菜单备份、恢复、脚本都是长按或连按触发。备份时先给存档起个名字默认建议时间戳键盘界面直接确认随后进度条开始走这条进度来自后台 worker 线程的实时回报备份中途还能取消。文件最终落在sdmc:/3ds/Checkpoint/saves/unique id game titleSwitch 为sdmc:/switch/Checkpoint/saves/title id game title3DS 的 extdata 另存一个平行目录。恢复方向相反从备份列表选一份盖回去Switch 端恢复完还会逐文件比对大小和 CRC32。Checkpoint 把过去要手改 JSON 的选项全搬进了设置页收藏与隐藏、按存档类型过滤、每个游戏的额外存档文件夹、FTP 与无线传输开关、主题与 9 种语言。3DS 按 SELECT、Switch 按 Minus 打开脚本菜单运行中的脚本把输出流进可滚动的日志面板对话框占另一块区域。后台还挂着两个服务器FTP 让你在 PC 上直接翻备份目录HTTP 日志服务器让浏览器实时看日志无线传输则由 PC 端的 chlink 命令行配合 4 位 PIN 码收发。数据流标题、备份与脚本各自怎么跑起来标题从哪来3DS 端由loadTitles串起几段流水线扫描 NAND、SD、卡带等多个来源把带存档的标题合并排序再序列化到 SD 做缓存下次启动先做哈希检查缓存新鲜就直接读缓存加刷新目录把慢路径压到只在标题集变化时触发。另有一条常驻的cartScan线程专门监听插拔卡带的动作。目录本体是单例 TitleCatalog3DS 端实现在 3ds/include/loader.hppSwitch 端在 switch/include/titlecatalog.hpp。一次备份的完整数据流是这样的主线程先把 Title、源路径、目标路径解析好打包成 WorkItem 塞进TransferJob的队列再start()起一个 worker 按序排空拷贝进度经 UiProgressSink 流回 TransferStatus主循环每帧拿它画进度条takeResult()收走结果后主线程才去refreshDirectories刷新备份列表。注意 worker 只做纯文件 IO从不碰标题目录两线程因此零竞争。脚本走另一条链一个 .c 文件由 picoc 解释器在 worker 线程上执行引擎本体 common/script/scriptengine.hpp 里不出现任何线程和 UI 的代码worker 由 common/script/scriptrunner.hpp 管理脚本调用gui_*时把自己停泊在 UI 桥上等主循环应答打印进日志面板长按 B 键约 45 帧触发requestCancel解释器在下一条语句处失败退出死循环也不用重启主机这段按键计时写在 switch/source/main.cpp 的主循环里。值得借鉴的三个设计点worker 模式配状态机。备份和脚本共用同一套形状TransferJob和ScriptRunner都是原子状态 Idle/Running/Done 主线程每帧轮询 takeResult的模式进度回调和取消开关都挂在状态边上主循环因此永远不用阻塞等待退出路径也统一成先请求停止再 join。返回快照外加代际号。标题目录的后台重载会清空再重填内部 vector查询若返回引用就会悬空所以getTitle一律拷贝一份 Title 交出去再配一个mGeneration单调递增的代际计数UI 缓存BackupList对比代际号决定要不要重建省掉每帧无条件重算。这段为什么必须拷贝的注释直接写在 3ds/include/loader.hpp 的类文档里值得细读。脚本引擎三层分离。解释ScriptEngine、线程与取消ScriptRunner、界面挂起唤醒ScriptUiBridge拆成三块好处是解释器可以脱离界面单独跑测试取消逻辑也不用侵入解释器内部。构建、配置与二次开发入口编译需要 devkitARM3DS和 devkitA64Switch依赖经 dkp-pacman 安装例如 3DS 端装 libctru、citro3d、3ds-curl 等。首次克隆后要git submodule update --init --recursive拉取脚本引擎子模块然后在仓库根目录执行make 3ds # 3DS 版 make switch # Switch 版配置存于config.json如sdmc:/3ds/Checkpoint/config.json但推荐直接在设置页操作每次改动同步写盘不必手改 JSON。二次开发的主入口就是脚本把 .c 放进scripts/universal对所有游戏生效或放进scripts/title id只对该游戏生效写之前用tools/scriptlint.sh在 PC 上做解析检查scripts/README.md 是完整 API 参考scripts/examples/example.c 是一份按 API 区域组织的可运行示例。PC 端的 chlink 用 Go 写在 tools/chlink可单独构建通过 4 位 PIN 与主机上的 Checkpoint 收发存档。Checkpoint 适合想统一管理两台主机存档、并希望用脚本把备份接到自己网盘上的玩家也适合想在资源受限掌机上研究长耗时 IO、跨线程安全与可扩展性的开发者。【免费下载链接】CheckpointFast and simple homebrew save management framework for 3DS and Switch.项目地址: https://gitcode.com/gh_mirrors/ch/Checkpoint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价