Files
cmr-mini/doc/gameplay/故障恢复机制.md

5.0 KiB
Raw Permalink Blame History

故障恢复机制

文档版本v1.0 最后更新2026-04-02 08:28:05

本文档用于说明当前客户端在“游戏进行中非正常退出”场景下的恢复机制。

目标:

  • 明确当前恢复能力边界
  • 说明恢复快照保存什么、不保存什么
  • 说明恢复流程、清理流程和测试方法

1. 设计原则

当前恢复机制采用:

轻量快照恢复,而不是页面状态回放

原则如下:

  • 只恢复核心运行态
  • 不恢复瞬时 UI
  • 恢复后由规则层和展示层重新计算派生状态
  • 恢复失败时允许直接降级回正常开局
  • 不为了恢复体验牺牲主流程性能

2. 当前恢复范围

2.1 会恢复的内容

  • 当前配置入口
  • 当前对局核心状态
  • 已完成点 / 已跳过点
  • 当前分数
  • 开赛时间 / 结束时间 / 结束原因
  • 模式状态 modeState
  • 遥测累计值
  • 最后 GPS 点与精度
  • 地图基础视口
  • GPS 锁定状态

2.2 不恢复的内容

  • 白色内容卡
  • 答题卡中间态
  • 黑底引导提示条
  • 彩色短反馈条
  • 待查看内容入口
  • 临时动画和过渡效果
  • 各类计时器、定时器、提示队列

说明:

这些内容都属于派生 UI 或瞬时体验,恢复后会重新按当前运行态计算,不直接持久化。


3. 快照结构

当前恢复快照定义在:

结构分为 4 块:

  1. 快照元信息
  • schemaVersion
  • savedAt
  1. 配置身份
  • launchEnvelope
  • configAppId
  • configVersion
  1. 对局核心状态
  • gameState
  1. 运行态附属状态
  • telemetry
  • viewport
  • currentGpsPoint
  • currentGpsAccuracyMeters
  • currentGpsInsideMap
  • bonusScore
  • quizCorrectCount
  • quizWrongCount
  • quizTimeoutCount

4. 保存时机

当前 V1 保存时机如下:

  • 对局进入 running 时先保存一次
  • 对局进行中按低频节流定时保存
  • 页面 onHide 时保存一次
  • 页面 onUnload 时保存一次

当前默认节流周期:

  • 5

说明:

  • 不做每帧保存
  • 不在所有 GPS 更新时保存
  • 只做低频检查点式持久化

5. 恢复流程

当前恢复流程如下:

  1. 页面进入时先解析启动入口
  2. 如果没有显式新启动参数,则检查是否存在恢复快照
  3. 若存在恢复快照,则优先使用快照中的 launchEnvelope
  4. 配置加载完成后校验快照身份
  5. 若快照属于当前配置,则弹出“继续恢复 / 放弃”确认
  6. 用户确认恢复后:
  • 先恢复系统设置运行态
  • 再恢复 GameRuntime 核心状态
  • 再恢复 TelemetryRuntime
  • 再恢复地图视口与 GPS 锁定态
  • 最后重新计算 HUD、按钮和提示

恢复相关落点:


6. 清理规则

以下情况会清除恢复快照:

  • 正常完赛
  • 超时结束
  • 主动退出
  • 用户在恢复确认框中选择“放弃”
  • 快照配置身份与当前配置不匹配
  • 恢复失败

说明:

恢复快照只服务“未正常结束的进行中对局”。


7. 当前实现边界

当前 V1 的明确边界是:

  • 支持续局
  • 不支持恢复答题进行中
  • 不支持恢复内容卡浏览进行中
  • 不支持恢复弹层堆栈
  • 不支持恢复临时 FX 状态

这不是缺陷,而是当前版本的刻意收敛。


8. 性能策略

当前恢复机制的性能策略如下:

  • 快照只存小而必要的结构
  • 不重复存整份远端配置 JSON
  • 不存派生展示状态
  • 不做高频写入
  • 恢复后尽量走现有规则重算链

所以这套恢复机制更接近:

保存运行核心状态 + 重新生成界面

而不是:

保存整个页面现场


9. 测试建议

9.1 基础恢复

  1. 开一局并至少完成 1 个点
  2. 不正常结束,直接退后台并杀掉程序
  3. 再次进入地图页
  4. 确认出现恢复提示
  5. 点击“继续恢复”
  6. 确认分数、已完成点、计时和地图状态都能续上

9.2 放弃恢复

  1. 重复上面步骤进入恢复提示
  2. 点击“放弃”
  3. 确认回到正常初始状态
  4. 再次进入时不应重复提示

9.3 正常结束清理

分别验证:

  • 正常打终点结束
  • 主动退出
  • 超时结束

结果都应为:

  • 不再保留恢复快照
  • 再次进入不再提示恢复

10. 后续演进方向

后续如果要继续增强,建议顺序如下:

  1. 先补恢复链的 smoke tests
  2. 再考虑恢复更多遥测累计细节
  3. 最后才考虑是否恢复答题态或内容态

不建议一开始就追求全量 UI 恢复。


11. 一句话结论

当前故障恢复机制的定位是:

保证玩家在异常退出后可以继续当前对局,但不承担恢复所有临时界面状态。