15.3 资产 diff 与回滚
回滚不是「把文件覆盖回去」:一次改版牵动新增/修改/删除三态,还会沿着引用关系把没直接变的资产一起拖下水。本节把两份资产快照做三态 diff,再用反向闭包生成回滚计划,用一份真跑的 S 层脚本和 P 层 TS 内核给出逐位一致的计划与违例,并用漏掉依赖者的负例证明门禁真的会 fail。
tag
回滚不是「把文件覆盖回去」:一次改版牵动新增/修改/删除三态,还会沿着引用关系把没直接变的资产一起拖下水。本节把两份资产快照做三态 diff,再用反向闭包生成回滚计划,用一份真跑的 S 层脚本和 P 层 TS 内核给出逐位一致的计划与违例,并用漏掉依赖者的负例证明门禁真的会 fail。
PSD、PSB、Aseprite、MOV 这类真身动辄几十兆,塞进主库会让每次克隆都慢到无法忍受。本节给《星屑旅店》定一套「主库只放指针、真身放远端」的协作法,用一份真跑的 S 层脚本和 P 层 TS 内核做指针清单与远端清单的双向对账,并算清仓库体积账。
版本号不是「最后一次保存」的时间戳,而是可解析、可排序、可对账的整数序。本节给《星屑旅店》的资产版本定一套 v<NNN>[_<变体>] 文法,用一份真跑的 S 层脚本和 P 层 TS 内核给出逐位一致的违例集合,并用乱序、跳号、重号、同号并行分支四条负例证明门禁真的会 fail。
评审开完会,问题必须有归属、有期限、有状态,决策必须能追到后续的资产变更。本节把《星屑旅店》的走查记录写成带状态机的 schema,用 S 层脚本算闭环率、逾期率与决策可追溯率,用 P 层 TS 内核做状态机合法性校验,并用两条非法跃迁负例证明跳步会被拦下。
评审最怕「我觉得不太行」——没有数字就没有返工依据。本节把《星屑旅店》的评审做成一张评分卡:每项给整数分与整数权重算加权分,通过或打回由「加权分达阈 且 无单项否决」两条规则决定。S 层算出加权分与判定,P 层复算同一套规则并用负例证明单项否决必须打回、加权刚好达阈必须通过。
评审不能随时拉个会了事,而要排成概念、制作中、接入前三个固定节点,每个节点各拦一类错。本节把《星屑旅店》三个节点的检查项、必需角色与否决权写成一份可校验的排班矩阵,用真跑的 S 层脚本与 P 层 TS 内核给出逐位一致的缺项与缺角色违例,并用两条负例证明门禁真的会 fail。
验收不是打勾,是算账。本节把《星屑旅店》的八批交付做成评分卡(整数分 ×10,加权后过线即通过)与返工归因分类账,用一份真跑的 S 层脚本算一次通过率、返工率与各类归因占比,并用 P 层 TS 内核复算到逐位一致;再故意造两份冲突账,证明评分与结论打架、归因不在允许集里都会被拦下。
技术规格表和交付物清单是两份各自演进的数据,只数个数会漏掉一半问题。本节把《星屑旅店》的四条规格与四份交付按 id 对齐,用一份真跑的 S 层脚本算缺项、多项与字段不一致三个方向,并用 P 层 TS 内核复算到逐位一致——缺项是规格没落地,多项是交了没要的东西,两者都必须被拦下。
外包需求靠口头传达必然返工。本节把《星屑旅店》的一张家具需求变成带字段的 Brief:参考图、尺寸、风格约束、交付格式、验收口径,并用一份真跑的 S 层脚本与 P 层 TS 内核校验必填字段、枚举取值、参考图与调色板 token 的引用完整性,再用一份故意写坏的样本证明四类违例都会被拦下。
反馈要有轻重之分:本节把《星屑旅店》的反馈分成轻/中/重三级,给出每级的时长、位移像素、缩放千分比、震屏像素与颜色 token 引用,用整数判据断言相邻两级的参数差必须 ≥ 下限,并用一张故意不达标的表证明「三级可区分」真的会被门禁拦下,附 S 层脚本与 P 层 TS 内核的逐位一致复算。
动画规范要把「几帧、多少毫秒、混合多久」说死:本节把《星屑旅店》三个角色在统一 30fps 下算成整数帧账,给出帧数、对齐毫秒与残差,用状态完备性 lint 抓出缺失的死亡动画,并说明同帧率下两段动画的时间轴如何靠公共帧(帧数的最大公约数)对齐,附 S 层脚本与 P 层 TS 内核的逐位一致复算。
特效预算不是「看着炫就行」:本节把《星屑旅店》四个特效拆成爆发、持续、消散三阶段,用整数毫秒、千分比屏占比、峰值存活粒子数与叠加层数算一笔可跑的账,并按四项上限逐项判违例,给出超屏占比与超层数必须 fail 的负例,附 S 层脚本与 P 层 TS 内核的逐位一致复算。
模块化 kit 的验收不能只看「像不像」,还要算得出账。本节把《星屑旅店》的大堂与后仓摆成 8×8 等距网格,用整数地板除算地块复用率、视觉遮挡层数与可行走可达性三个指标,并复用 core/src/sp00/spec.ts 的 isoToScreen 做同源等距投影,给出「复用率更高但遮挡与可达性双违例」的必须 fail 负例,附 S 层脚本与 P 层 TS 内核的逐位一致复算。
「细节太碎」是美术评审的高频评语,但没人说得清碎到什么程度算碎。本节把《星屑旅店》的家具贴片拆成细节密度(边缘像素千分比)与视觉噪声(2×2 棋盘拐点千分比)两个整数口径,四档木纹从留白 69‰ 一路排到过载 1000‰,给出过密必须 fail 的负例,附 S 层脚本与 P 层 TS 内核的逐位一致复算。
「剪影要清晰、别太碎」这种口号没法验收。本节把《星屑旅店》的道具剪影拆成面积、轮廓像素周长、紧凑度千分比与外接框占空比四个整数口径,再用降采样交并比判定「缩到 32px / 16px 后是否还分得开」,给出圆带把手在 16px 塌成圆必须 fail 的负例,附 S 层脚本与 P 层 TS 内核的逐位一致复算。
图集怎么切,直接决定 drawcall:同一图集里的精灵可合批,跨图集必须拆。本节给出「按图集划分 → drawcall 数」的可跑账,并对比一张大图集与按类型/按主题切成多张小图集两套策略——装箱率与 drawcall 是一对必须一起算的取舍。
把一堆大小不一的图标装进 1024×1024 图集,并用一个千分比整数衡量装得好不好:先复现共享真源的基线 256/37/144,再用确定性货架装箱(高度降序 + 固定 tie-break)把 24 个混合尺寸图标装进 256/512/1024/2048 四档,给出可跑的 Python + TypeScript 装箱账。
把图标从「画在 24 网格上」变成「机器可判」:讲清网格尺寸、描边宽度阶、安全区内边距三组整数参数,用一份可跑的 Python + TypeScript 判定每个图标落在网格里的哪一格,并让越界、描边过粗、像素不对齐三类缺陷都真的 fail。
技术美术站在美术与程序之间,握着「规格拍板」与「接入会签」两件事。本节先讲清 TA 的三类工作与三个接口,再给出一张 ART_SCOPE 分工表,并用一段可跑的 TypeScript 路由表把它锁死:渲染原理必须判给 external,误判成本套的朴素路由会被负例测试当场拦下。
同一件交付物,谁执行、谁会签、谁最终拍板,必须唯一——每行只能有一个 A。本节把美术团队的分工写成一张 RACI 职责矩阵,并用一段可跑的 TypeScript 校验器把它锁死:任何交付物出现两个拍板角色、或拍板角色混进自己的会签列表,测试都会立刻失败。