docs(10-35): 录像底层原理页收口

This commit is contained in:
AncTe committed 2026-10-26 21:16:45 +08:00
1 parent fddeeaa7a9
commit 0db7800ff5
2 files changed
+171 -5

No files matched your search

+5 -5
View File
@@ -45,13 +45,13 @@ saveState()
| `ReplayCommandType.Active` | 自己执行这一步,并返回执行结果 |
| `ReplayCommandType.Passive` | 不执行自己的逻辑,只把参数交出去;外部执行完再回报状态 |
两类指令的 `execute` 都返回 `ReplayCommandResult`,三种取值决定播放是否继续:
两类指令的 `execute` 都返回 `ReplayCommandResult`;主动步用它决定播放是否继续,被动步则由 `next(status)` 的状态决定。三种取值是:
- `Success`:这一步成功,继续播放。
- `Failed`:这一步失败,播放中止。
- `Ignored`:失败但可以忽略,控制台输出信息后继续。
`finalize` 是连续步骤的收尾:**指令切换或录像结束时**,上一条指令会收到一次 `finalize`,同一指令连续多步之间不会逐步触发。典型用途是连续多步操作后统一提交:每步只更新暂存状态,等到收尾时再一次性结算。
`finalize` 是连续步骤的收尾:**指令切换或录像结束时**,上一条主动指令会收到一次 `finalize`,同一指令连续多步之间不会逐步触发。典型用途是连续多步操作后统一提交:每步只更新暂存状态,等到收尾时再一次性结算。
玩家入口通常把「记录」与「执行」放在一起:
@@ -149,7 +149,7 @@ export class ReplayChoiceConsumer {
读档走 `loadState()`:设置宽度与两个缓冲区、写入长度,然后重建索引,并把此前创建的所有读取流标记为过期。正在播放的沙箱不会自动恢复,需要重新创建。
录像的指令码与参数类型码遵循只增不改:新语义必须分配新值,不能复用旧码。格式也不承诺能让新版本读回由旧格式写出的录像。
录像的指令码与参数类型码遵循只增不改:新语义必须分配新值,不能复用旧码。格式只增不改,也不承诺旧文本格式能被新版本读回。
## 内部实现:三块缓冲区
@@ -181,9 +181,9 @@ export class ReplayChoiceConsumer {
索引让「按步号直接定位参数」成为可能:读取第 n 步时,先从指令区拿到参数个数与指令码,再从索引区拿到参数起点,最后按类型标记逐个解码参数。
随机读单步并不快:`get(index)` 需要单独解码这一步的参数,无法像顺序读那样复用上一步的位置。它是给「确实要跳到某一步」的场景准备的,不是播放路径。
随机读单步并不快:`get(index)` 是独立的随机读取,单步调用比顺序流更重。它是给「确实要跳到某一步」的场景准备的,不是播放路径。
播放走读取流:`createReadStream(startIndex)` 返回一个带 `index`、`length`、`expired` 的流,`read()` 每调用一次前进一歩,读完返回 `null`。任何写操作都会让已有读取流失效:追加、插入、删除、改写、切换宽度、整块读档都会把流标记为 `expired`,过期后继续 `read()` 会告警。需要修改录像时,先停止播放并重建沙箱。
播放走读取流:`createReadStream(startIndex)` 返回一个带 `index`、`length`、`expired` 的流,`read()` 每调用一次前进一步,读完返回 `null`。任何写操作都会让已有读取流失效:追加、插入、删除、改写、切换宽度、整块读档都会把流标记为 `expired`,过期后继续 `read()` 会告警。需要修改录像时,先停止播放并重建沙箱。
## 旧引擎基线对比