跳转至

会话与崩溃恢复

视频教程 —— 即将推出

Harmony 崩溃不会让你丢掉 staging 树。

在 Assemble 跑起来之前,那棵树在这世上别无他处:没有对应的工程格式,而 vacuum 读的是场景,而场景还什么都没收到。所以 OSA 自己持续地保存它。

保存了什么

staging 树、当前选择,以及 UI 状态 —— 哪些面板折叠了、哪些显示开关开着、分隔条在哪。

树是这一天的工作。UI 状态只是方便:万一收集它失败了,树照写不误,因为丢掉分隔条位置只是烦人,丢掉树是丢掉一天。

什么时候保存

两个计时器,不是一个:

计时器 何时触发
闲置 你停止改动几秒之后 —— 每次编辑都会重新计时
上限 一个固定的最大值,不管你在干什么

上限是第二个计时器,而不是第一个里面的一个计数器,因为闲置计时器每次变更都会重新计时 —— 任何存在它里面的截止时间,都会被一个繁忙的会话无限往后推。

保存在哪

%APPDATA%/Toon Boom Animation/Toon Boom Harmony Premium/
    octo_scene_assembler/sessions/

每个场景一个文件,以场景名加一个哈希命名。不放在场景文件夹里:场景可能压根就没保存过,而在 Harmony Server 上那条路径是需要映射的逻辑路径,且不保证可写。

是怎么写的

tmp → 当前文件变成 .bak → 原子替换。

没有任何一瞬间让目标文件处于写了一半的状态。崩溃时你要么拿到完整的新文件,要么拿到上一个。备份只有一代,不是历史记录。

恢复

打开时,如果这个场景存在会话,会有一条栏把它递给你:

按钮 作用
Restore 从保存的会话重建 staging 树
Dismiss 删除保存的会话

Dismiss 是真的删除。 一个只把栏藏起来的"dismiss",意味着同样的提议会在每次打开时永远回来。

打开 Auto-restore Session(Preferences → Settings)后,树会不问自答地回来。

这条栏告诉你什么

消息 含义
Session restored — N nodes. 完成
…(X could not be restored.) 树回来了;"我刚才在哪"的一部分没回来
The most recent session was corrupt; this is the previous one. 用了 .bak
The saved session is unreadable. 两份拷贝都解析失败
This session was written by a newer version of OSA… 故意拒绝 —— 把一个未来的格式套用一半,会给你一棵看着像你的、其实不是的树

一个损坏的会话绝不会被悄无声息地丢掉。什么都不被告知,正是用户断定自动保存从来没起过作用的原因。

崩溃 vs 正常退出

正常关闭时 OSA 会移除一个"运行中"标记。下次打开时那个标记的缺失,是区分崩溃和正常退出的唯一依据 —— 而正是这个区分,让还原栏能说出真话。

打理

sessions 文件夹会自我清理:20 个文件,30 天,当前场景的会话永远受保护。没有这条,这个文件夹就会每个场景多一个文件地永远长下去,而没人会去那儿打扫。

当自动保存写不进去时

如果一次保存失败,会出现一条黄色消息 —— 每个连续失败段只出现一次,而不是每个心跳都来一条,几秒后自行消失。

原因会写进 osa.log,就在 sessions 同一个文件夹里,并且点名成因。如果失败是因为某个值无法序列化,日志会点名确切的那个键,因为"它失败了"这句话没人能据此做任何事。

出问题时去哪儿看

%APPDATA%/Toon Boom Animation/Toon Boom Harmony Premium/octo_scene_assembler/osa.log

技术支持也靠这个文件读懂你的 Harmony 干了什么,而不需要你的场景。