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

245 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 故障恢复机制
> 文档版本v1.0
> 最后更新2026-04-02 08:28:05
本文档用于说明当前客户端在“游戏进行中非正常退出”场景下的恢复机制。
目标:
- 明确当前恢复能力边界
- 说明恢复快照保存什么、不保存什么
- 说明恢复流程、清理流程和测试方法
---
## 1. 设计原则
当前恢复机制采用:
`轻量快照恢复,而不是页面状态回放`
原则如下:
- 只恢复核心运行态
- 不恢复瞬时 UI
- 恢复后由规则层和展示层重新计算派生状态
- 恢复失败时允许直接降级回正常开局
- 不为了恢复体验牺牲主流程性能
---
## 2. 当前恢复范围
### 2.1 会恢复的内容
- 当前配置入口
- 当前对局核心状态
- 已完成点 / 已跳过点
- 当前分数
- 开赛时间 / 结束时间 / 结束原因
- 模式状态 `modeState`
- 遥测累计值
- 最后 GPS 点与精度
- 地图基础视口
- GPS 锁定状态
### 2.2 不恢复的内容
- 白色内容卡
- 答题卡中间态
- 黑底引导提示条
- 彩色短反馈条
- 待查看内容入口
- 临时动画和过渡效果
- 各类计时器、定时器、提示队列
说明:
这些内容都属于派生 UI 或瞬时体验,恢复后会重新按当前运行态计算,不直接持久化。
---
## 3. 快照结构
当前恢复快照定义在:
- [sessionRecovery.ts](D:/dev/cmr-mini/miniprogram/game/core/sessionRecovery.ts)
结构分为 4 块:
1. 快照元信息
- `schemaVersion`
- `savedAt`
2. 配置身份
- `launchEnvelope`
- `configAppId`
- `configVersion`
3. 对局核心状态
- `gameState`
4. 运行态附属状态
- `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、按钮和提示
恢复相关落点:
- [map.ts](D:/dev/cmr-mini/miniprogram/pages/map/map.ts)
- [mapEngine.ts](D:/dev/cmr-mini/miniprogram/engine/map/mapEngine.ts)
- [gameRuntime.ts](D:/dev/cmr-mini/miniprogram/game/core/gameRuntime.ts)
- [telemetryRuntime.ts](D:/dev/cmr-mini/miniprogram/game/telemetry/telemetryRuntime.ts)
---
## 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. 一句话结论
当前故障恢复机制的定位是:
**保证玩家在异常退出后可以继续当前对局,但不承担恢复所有临时界面状态。**