6.2 参数对齐与打包
参数对齐不是玄学:一个常量寄存器是 16 字节 = float4,参数必须整块落在某个寄存器内、不许跨边界,放不下就顺延、余量作废。本节用《星屑旅店》的 10 个参数把「按逻辑顺序声明」与「按寄存器边界重排」各算一遍,给出可复现的整数账——naive 占 5 个寄存器、packed 占 4 个,S 层与 P 层逐位一致。
tag
参数对齐不是玄学:一个常量寄存器是 16 字节 = float4,参数必须整块落在某个寄存器内、不许跨边界,放不下就顺延、余量作废。本节用《星屑旅店》的 10 个参数把「按逻辑顺序声明」与「按寄存器边界重排」各算一遍,给出可复现的整数账——naive 占 5 个寄存器、packed 占 4 个,S 层与 P 层逐位一致。
材质参数表不是美术的内部草稿,而是美术与程序之间的契约:每个参数都要写明类型、取值范围、单位、默认值与是否暴露给美术。本节用《星屑旅店》三套材质做一份可跑的表校验,并让「默认值被改动」这件事在构建期就被摘要检测到,S 层与 P 层结果逐位一致。
图集重打包后,UV 变了的区域会牵动所有引用它的 sprite、material 与 screen。本节把这份引用关系建成有向图,从变更 rect 沿反向边做 BFS,输出受影响资产清单与需要重跑的回归套件,并让同一份传播逻辑在 Python 与 TS 内核两处逐位一致。
从场景入口沿依赖边做前向可达,可达集之外的资产就是不可达资产,也是候选删除清单。本节用 S 层 Python 与 P 层 TS 各自算一遍可达集,断言删除不可达资产后入口仍可达、可达集逐位不变;最后讨论不可达不等于可删的三条边界,避免清理误伤预留资产、动态引用与热更分包。
环意味着没有任何资产能先打包,增量构建会死循环;悬空引用则指向不存在的节点。本节用 DFS 三色标记(白/灰/黑)找环、逐边判悬空引用,并把环路径旋转到字典序最小节点做规范化,让环集合跨语言逐位一致。最后给出人为造环的负例断言:干净图不报、环图必报,证明检测器真的会 fail 而不是空转。
管线打包前必须先知道谁引用谁。本节把清单里显式的 dependsOn 与三类隐式边(命名约定、目录归属、材质槽)合成一张有向图,用 S 层 Python 建图并分类计数、P 层 TS 内核复算,两侧边集合 digest 逐位一致,并说明隐式边为什么是管线里最容易漏的一环。
前两节各报了 8 条问题,本节把它们合成一份分级清单:按一张可判定的映射表,每个规则码落到 block / warn / info 三级,并给出修复动作与能否自动修。16 条问题判成 block 3 / warn 11 / info 2,3 条 block 落在 2 条记录上,门禁直接判阻断;分级表未覆盖的规则码一律判失败。
上一节判的是「字段对不对」,这一节判「值合不合规」。尺寸、格式、命名三类判据被写成一张全整数与字符串的规则表,再用一份真跑的 Python 规则引擎与 TS 内核在 9 条导入记录上跑出 8 条违例,八个规则码各命中一次;两侧违例集合逐位一致,且每条规则都配了一条能触发的负例。
导入是美术管线上的第一道闸门,而闸门的判据几乎全在侧车文件 .meta 里。本节给出一条可判定的判据——删掉后无法从源文件字节重算出来的才是契约字段,其余都是派生冗余——再用一份真跑的 Python 审计脚本与 TS 内核,在 9 条《星屑旅店》导入记录上报出 2 处契约缺失与 5 处派生漂移,两侧问题集合逐位一致。
本机没有任何 DCC,真打开、真导出、真渲染都不可能复现——但「不可复现」不该是留白。本节把这件事写成方法:用一份导出清单承载真环境的声明值,用 schema 静态校验管结构与跨字段一致性,用数值对齐账把声明值与管线账预测值逐条对上,并把「无 DCC 环境不得声明可命令行复现」编码成一条会失败的门禁。
单位和轴向看着只是导出面板上的两个下拉框,写错了就是落地灯十七米高、角色躺在地上。本节把单位换算、Y-up/Z-up 轴向置换、左手系/右手系镜像拆成三个正交问题,用一份可跑的整数账算出六种 DCC 约定各自的置换矩阵、行列式与镜像标志,并给出厘米→米与坐标置换的对齐结果。
资产从画师手里走到屏幕上要穿过四个阶段:DCC 制作、导出、导入、运行时。本节讲清每个阶段谁负责、产出什么、边界上要交接哪些字段,再用一份可跑的整数账把同一批《星屑旅店》资产在四阶段的顶点数与字节量算出来:顶点因 UV 缝与硬边膨胀多少千分比,运行时字节为什么几乎全由纹理决定。
16.2 证明了一条链能被同一套判据反复跑,但「跑得通」不等于「交得出去」。本节给卷二收尾:把全卷产出列成一张交付物清单,点名哪几批交给卷三《风格与品类美术实战》,并用一段 S 层脚本与一份 P 层 TS 内核校验清单完整性——字段齐全、kind/status 合法、id 唯一、接手目标存在且已 done。
前十五章各写了一段管线,却没人说清谁先谁后、谁的输出喂给谁。本节把它们串成一条有向链,给出一张能跑的装配检查表:每个阶段标注它由本卷哪一节提供可跑脚本与档位,再用一份 S 层脚本与 P 层 TS 内核做四类对账——出处节是否真实、链路是否首尾相接、阶段号是否连续、首尾类型是否匹配。
验收不是「看一眼觉得行」,而是一台可执行的门:每条规则给一个阈值,每件交付物给一组测量值,逐项判定后落到 pass / conditional / reject 三级,再按包聚合成验收率与批次门禁。本节用一份示例规则表跑 8 件交付物,S 层 Python 与 P 层 TS 各自复算且 digest 逐位一致。
15.1 算出的基线是「报价时的数」,结算是「实际花掉的数」,两者之差就是超支。本节把成本拆成基线 + 变更 + 超计划返工 + 管理分摊四个加项,再把超支分解到三个可归因桶,S 层 Python 与 P 层 TS 各自复算且 digest 逐位一致;所有数字均为本套构造的示例参数。
外包的第一件事不是找供应商,而是把工作切成「可独立验收、可独立计价」的包。本节用一份示例配置,把按件、按人天、里程碑分期、阶梯单价四种公开可观察的计价结构写成全整数模型,S 层 Python 算账、P 层 TS 复算,两侧 digest 逐位一致;所有单价与人天均为本套构造的示例参数,与真实报价无关。
工业化不是一次做到合格,而是每一批都合格。本节用《星屑旅店》16 个资产的实测记录,把命名、网格、线宽、色板四个维度的合规率算成整数千分比,得到一致性指数 890‰,并把同批按小组拆开算出跨批漂移 94‰;返工的 5.60 人天正好吃掉 14.1 有效产能的 156‰。
排期不是画一张甘特图,而是在依赖 DAG 上算关键路径。本节用《星屑旅店》九个美术任务的依赖图,算出最早开始、最晚结束与浮动时间(全整数),S 层 Python 与 P 层 TS 内核的 digest 逐位一致,并用三个负例证明检测器会拦下环、悬空依赖与紧截止导致的负浮动。
产能账要能被复算,先得把「人天」拆成日历人天与有效人天。本节用《星屑旅店》一支示例团队,把出勤率、专注率、角色产能与资产需求写成全整数的人天×100 账,算出利用率 1058‰、吞吐 1.20 资产/人天,并说明为什么日历人天会让计划看起来比实际宽松。