本节摘要:把前五章的山体资产架成正式产线:Wedge 批量变体 → HDA Processor 统一执行 → 输出核对。工程重点是三件事:缓存分层(算过的绝不重算)、失败隔离(一项挂全 line 不停)、产物核对(数量与命名可审计)。
需求设定:按 12 个种子 × 3 档侵蚀强度出 36 座山,每座输出几何缓存 + 预览渲染。TOP 网络四段:
@seed、@erode_strength 进文件名);产线最贵的错误是重复计算。分层设计:
| 层 | 内容 | 变更触发重算的范围 |
|---|---|---|
| L1 原始变体定义 | Wedge 属性表 | 只改清单,不重算下游已完成项 |
| L2 几何缓存 | 每变体 bgeo | 只重算被改参数命中的 item |
| L3 渲染产物 | 预览/成品图 | 只重渲对应图 |
实现要点:缓存路径全部由 item 属性确定性拼出(同参数必同名),TOP 的缓存机制据此识别"这个 item 之前算过"。切忌路径里掺入时间戳或随机后缀——缓存识别立刻失效。
# 核对节点(Python TOP 内示意) expected = 36 found = len(hou.topology...) # 实际成功 item 数 if found < expected: raise hou.Error(f'产物缺失: {found}/{expected}')
不是一切都要 TOP 化。判断三问:
山体变体、按镜头批量出环境、批量烘焙贴图——都是标准答案;单一 hero 资产的艺术调优——不是。
⚠️ 常见坑:产线里直接引用当前 hip 会话里的活网络(ROP Fetch 指向未冻结的节点),艺术家中午改了个参数,下午产线全量重算。产线的输入必须是冻结物:HDA、缓存文件或锁定的 hip。
💡 关键直觉:产线思维 = 把"参数空间"当产品经营。36 座山不是 36 次劳动,是一次定义 + 一夜算力。
单机工厂建好了。第 7 章解决"资产怎么走出你的电脑":HDA、Engine 与 USD。
把前几章的全部能力装配成流水线,TOP 网络的标准分段:参数楔取(Wedge 生成变体矩阵)→ 几何生成(ROP Geometry,每变体一个工作项)→ 质检(Python TOP 校验属性字典)→ 打包(HDA Processor 输出资产)→ 通知( Email/Slack TOP)。质检段是工程化的分水岭:
# Python Processor TOP —— 变体质检模板 for work_item in upstream_items: geo = work_item.expectedResultData # 落盘几何路径 stats = check_geo(geo) # 面数/属性完整性/包围盒合法性 if stats["fail"]: work_item.addError("tri=%d missing=%s" % (stats["tris"], stats["missing"])) continue # 失败项标记, 不阻断整批 work_item.setAttribute("tris", stats["tris"])
失败项被标记并汇总到报告,而非让整条流水线停摆——"局部失败不全局熔断"是批量生产与桌面实验的本质区别。
[缓存分层] L1 参数敏感缓存: TOPs 的 work item 产物天然按参数哈希落盘 L2 阶段缓存: 环境章的 Stage 冻结(FileCache 显式节点) L3 发布缓存: 资产库版本化的 HDA/USD 只增不改 纪律: 任何手改缓存的行为必须留下"破坏标记"文件, 下次 Cook 前脚本扫描并强制重算该分支