一份开放世界存档里到底装了什么

单机时代的存档很简单:角色等级、解锁关卡、背包,一个文件就能装下。im体育App里的开放世界不一样,你离线的这段时间,NPC还在训练,赛事还在举办,排名还在变化。如果把这些都塞进一个存档文件,然后在两台设备之间整份覆盖,很快就会出问题。

先看一个模拟场景:你周五晚上在平板上赢了一场海岸冲浪赛,一名冲浪NPC因此把你记成了宿敌;周六白天在地铁里用手机离线练了一小时滑板,解锁了一块新板面。周六晚上两台设备都连上网,如果系统只认“最后一次上传的完整存档”,那么要么冲浪赛的胜利消失,要么新板面消失。这正是我们要把存档拆开处理的原因。

两类数据,两种归属

玩家层:只属于你的东西

这一层绑定账号,包括角色外观、各项目技能等级、装备和板面、已完成的挑战、个人最佳成绩、设置偏好。它的特点是“只有你能改”,数据量也比较小,适合完整进入云存档。

世界层:你参与过、但不归你一个人管的东西

这一层包括NPC对你的记忆与关系、赛事结果、排行榜名次、俱乐部状态、城市里的动态活动。它由服务器维护,因为即使你不上线,世界也在推进。你的客户端里存的只是一份“最近一次看到的世界快照”,真正的权威版本在服务器上。关于玩家离开后世界如何继续变化,可以参考动态体育世界那篇文章。

数据 所属层权威来源离线时能否改动
技能等级、装备、板面玩家层云存档 可以,上线后上传
个人练习成绩 玩家层云存档 可以,标记为离线成绩
正式赛事名次世界层 服务器 不可以,需在线参赛
NPC关系与宿敌记录 世界层 服务器 只能记录事件,由服务器结算
地图资源与缓存 本地不同步 与存档无关,可重新下载

什么时候同步

在im体育里,我们的设计是“小步多次”,而不是退出时一次性上传。具体的同步时机有五个:

  1. 登录成功时:先拉取服务器上的玩家层和最新世界快照,再进入地图。
  2. 完成一场比赛或挑战时:结果立即上传,世界层的结算以服务器回执为准。
  3. 获得或消耗道具时:玩家层做增量上传,只传变化的那几项。
  4. 切到后台时:Android和iOS都会在应用进入后台前尝试做一次快速同步,但系统可能随时挂起应用,所以这一步只是补充,不能指望它。
  5. 离线后重新联网时:客户端把离线期间的操作按时间顺序打包上传,服务器逐条校验后回写。

判断是否同步完成,看设置页的“云存档状态”:显示最后同步时间即表示成功;显示“待上传”则说明还有离线操作没有提交,这时不要卸载应用或清除数据。

冲突时听谁的

回到开头的例子。平板上传的是一条世界层事件“赢得海岸冲浪赛”,手机上传的是一条玩家层变化“解锁板面”。两者按层分开,不会互相覆盖,结果是两样都保留。

真正会冲突的情况主要有三种,处理方式各不相同:

  • 同一个字段在两台设备上都改过,比如两边都改了角色外观。取时间较晚的一次,并在App里提示“另一台设备上的修改已被替换”。
  • 可累加的数值,比如两台设备各获得了一些训练点数。直接合并相加,不取任意一边。
  • 离线成绩与在线世界不一致,比如离线时刷新了某条滑板路线的最佳成绩,但那条路线在此期间因为城市活动被临时封闭。成绩保留为个人记录,但不进入当期排行榜。

世界层原则上不存在“客户端赢了服务器”的情况。你的手机可以说“我在离线时做了这些事”,但NPC怎么记住你、排名怎么变,由服务器根据完整的世界状态结算。

玩家可以自己确认的几件事

在im体育的开放世界里,存档可靠性首先取决于账号:游客模式下的进度只存在本机,云存档要登录账号后才开始工作。其次,在多台设备之间切换前,先在旧设备上确认同步状态,再去新设备登录。如果你正准备更换设备,换手机后的进度一文里有一份更完整的检查清单。