写在前面:存档能写进去,不代表放对了地方
个人游戏早期最常见的存档做法,是把文件放在游戏目录旁边。
比如:
save.jsonconfig.inisaves/profile_1.dat
开发时很方便。
文件就在项目旁边,打开就能看。
但商业发布后,这个方案会暴露很多问题:
- 玩家没有写入权限
- Steam 安装目录被清理
- macOS App 包内不能随便写
- Linux 发行版路径不同
- 多用户共享同一台机器时冲突
- Steam Cloud 配置不好做
- 卸载和重装行为不符合玩家预期
魏临做过一款小型策略 RPG。
玩家带着一支三人巡逻队在边境小镇接任务、换装备、培养关系。
项目原型把存档写在游戏目录。
Windows 开发机上一直没问题。
直到测试玩家反馈:
“我装在 Program Files,游戏无法保存。”
“macOS 版每次重开都丢设置。”
“我想把存档从 Windows 拷到 Steam Deck,不知道文件在哪。”
魏临这才把存档路径当成正式技术选型处理。
一、先区分存档、配置和缓存
他先把文件分成三类。
第一类是存档。
玩家进度、角色、任务、装备、世界状态。
这类文件最重要,应该可备份、可迁移、可云同步。
第二类是配置。
分辨率、音量、语言、输入设置、画质档位。
这些通常跟设备相关,不一定应该跟着存档跨设备同步。
第三类是缓存。
缩略图、临时下载、编译后的着色器缓存、日志。
这些可以重建,不应该进入云同步。
早期所有文件混在一起。
现在三类文件路径和生命周期不同。
这个分类决定后续所有路径选择。
二、为什么不写游戏安装目录
游戏安装目录看起来直观,但不可靠。
在 Windows 上,如果游戏装在 Program Files,普通用户可能没有写权限。
在 macOS 上,应用包内部不应该写玩家数据。
在 Steam Deck 或 Linux 上,安装目录也可能由平台管理。
此外,玩家卸载游戏时,安装目录可能被删除。
如果存档在里面,就有丢失风险。
魏临决定:
正式版永远不把玩家数据写入安装目录。
安装目录只放只读游戏内容。
玩家数据放系统推荐的用户数据目录。
三、各平台路径怎么选
魏临使用引擎提供的 persistent data path 作为基础,但没有完全盲信。
他实际检查了各平台路径:
- Windows:
%USERPROFILE%/AppData/LocalLow/Studio/Game - macOS:
~/Library/Application Support/Studio/Game - Linux:遵循 XDG,优先
~/.local/share/Studio/Game - Steam Deck:实际落在 Linux 用户目录下
然后在游戏里提供“打开存档目录”按钮。
这个按钮很实用。
玩家要备份、迁移、发 bug 存档时,不需要去论坛找路径。
个人游戏越小,越应该减少玩家排查成本。
四、配置是否跟随云同步
魏临一开始想把所有文件都放进 Steam Cloud。
后来发现配置不一定应该同步。
例如:
- 桌面 PC 用 2560x1440
- Steam Deck 用 1280x800
- 一台机器用键鼠
- 另一台机器用手柄
如果配置随云同步,玩家每换设备都要重新调。
最终方案是:
- 存档进入 Steam Cloud
- 输入配置可选同步
- 分辨率、图形、音频设备不进云
- 日志和缓存不进云
语言设置是否同步,他做了一个折中:
默认同步,因为它更像玩家偏好;但如果启动参数指定语言,则覆盖云配置。
五、存档文件结构
他设计了目录结构:
GameData/
saves/
profile_1/
save.json
meta.json
backups/
config/
user_settings.json
input_bindings.json
logs/
game.log
cache/
thumbnails/
meta.json 保存存档摘要:
- 显示名
- 游戏版本
- 游玩时间
- 最后保存时间
- 当前章节
- 截图路径
主菜单读取 meta.json,不用打开完整存档。
这让存档列表加载更快,也降低损坏影响。
六、原子写入和备份仍然需要
路径选对不代表安全。
魏临仍然使用原子写入:
- 写到临时文件
- 校验成功
- 替换正式文件
- 保留上一份备份
如果保存过程中断电,至少还有旧文件。
他还限制备份数量,例如每个档位保留最近 5 个自动备份。
备份不进入主存档列表,但玩家可以通过“恢复备份”入口使用。
这对 RPG 特别重要。
玩家投入几十小时后,存档损坏是很难接受的。
七、跨平台兼容要避免路径写进存档
魏临发现一个隐藏问题。
早期存档里保存了截图绝对路径:
C:\Users\...\saves\profile_1\screen.png
这在跨平台后会失效。
他改成保存相对路径:
screenshots/latest.png
所有资源路径、截图路径、外部引用都尽量相对存档目录。
存档里也不保存平台相关分隔符,而是保存逻辑路径。
跨平台存档最怕把某个平台的文件系统细节写进去。
八、便携版需求怎么处理
有玩家希望便携版,把存档放游戏目录,方便 U 盘带走。
魏临没有默认这么做。
但提供启动参数:
--portable
启用后,游戏会在安装目录旁边创建 PortableData。
同时主菜单明确显示“便携模式”。
这个模式不适合普通 Steam 版,但适合 itch 或免安装版本。
技术选型不是完全否定某个方案。
而是让它只在合适场景启用。
九、迁移和诊断
魏临还做了两个小功能:
- 导出存档包
- 导入存档包
导出时把存档、meta 和必要截图打包。
不包含日志、缓存和设备配置。
这让玩家从 Windows 迁到 Steam Deck 更简单。
也方便测试玩家发存档复现 bug。
结语:路径选择是玩家数据承诺
魏临后来发现,存档路径不是小细节。
它影响权限、云同步、卸载、迁移、备份、诊断和玩家信任。
个人游戏技术选型里,跨平台文件路径很容易被推迟。
因为开发机上通常没问题。
但只要游戏要正式发布,就应该尽早决定:
- 哪些是存档
- 哪些是配置
- 哪些是缓存
- 哪些进云
- 哪些跟设备走
- 玩家如何找到和导出
把玩家数据放对地方,是商业发布的基本功。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。