6.2 自动化流水线构建


6.2 自动化流水线构建

本节摘要:把前五章的山体资产架成正式产线:Wedge 批量变体 → HDA Processor 统一执行 → 输出核对。工程重点是三件事:缓存分层(算过的绝不重算)、失败隔离(一项挂全 line 不停)、产物核对(数量与命名可审计)。

产线设计:山体变体工厂

需求设定:按 12 个种子 × 3 档侵蚀强度出 36 座山,每座输出几何缓存 + 预览渲染。TOP 网络四段:

  1. Wedge 变体展开:两个 wedge 属性(seed 12 档、erode_strength 3 档),交叉组合 36 个 item;
  2. HDA Processor:把第 4 章的高度场流水线封装成 HDA(封装细节第 7 章),HDA Processor 为每个 item 实例化并按 item 属性调参数。为什么用 HDA 而不是 ROP Fetch 直连当前 hip 里的网络:产线执行单元应该是冻结版本的资产——hip 文件随手改,HDA 带版本号,产线可复现;
  3. ROP Geometry / ROP Fetch 出缓存:每 item 一份 bgeo.sc,路径由 item 属性拼出(@seed@erode_strength 进文件名);
  4. ROP Karma/Mantra 预览渲染:依赖缓存段,渲染每座山的预览图。

图 6.2-1 产线依赖与缓存分层

缓存分层:产线的经济学

产线最贵的错误是重复计算。分层设计:

内容 变更触发重算的范围
L1 原始变体定义 Wedge 属性表 只改清单,不重算下游已完成项
L2 几何缓存 每变体 bgeo 只重算被改参数命中的 item
L3 渲染产物 预览/成品图 只重渲对应图

实现要点:缓存路径全部由 item 属性确定性拼出(同参数必同名),TOP 的缓存机制据此识别"这个 item 之前算过"。切忌路径里掺入时间戳或随机后缀——缓存识别立刻失效。

失败隔离与核对

  • 失败只报不停:Local Scheduler 默认行为是继续煮其他 item,失败的标红。写一个小型 Python TOP 或 Switch 分支把失败清单汇总成 log/表格——产线的可观测性与产线本身同等重要;
  • 产物核对:末段放一个对照逻辑(Attribute 从 Wedge 继承预期数量,与实际文件数比对),对不上就报警。36 座山少 3 座,人工肉眼是查不出来的;
  • 环境一致:农场/云上执行的 Houdini 版本、HDA 版本要与本地一致。产线 header 里写死版本号是笨但可靠的做法。
# 核对节点(Python TOP 内示意) expected = 36 found = len(hou.topology...) # 实际成功 item 数 if found < expected: raise hou.Error(f'产物缺失: {found}/{expected}')

什么值得上产线

不是一切都要 TOP 化。判断三问:

  1. 任务数够多吗?(<10 个,手动跑+脚本更省心)
  2. 任务彼此独立吗?(有强顺序依赖的链式流程,产线收益骤减)
  3. 会反复重跑吗?(一次性交付上产线是过度工程)

山体变体、按镜头批量出环境、批量烘焙贴图——都是标准答案;单一 hero 资产的艺术调优——不是。

⚠️ 常见坑:产线里直接引用当前 hip 会话里的活网络(ROP Fetch 指向未冻结的节点),艺术家中午改了个参数,下午产线全量重算。产线的输入必须是冻结物:HDA、缓存文件或锁定的 hip。

💡 关键直觉:产线思维 = 把"参数空间"当产品经营。36 座山不是 36 次劳动,是一次定义 + 一夜算力

本节要点回顾

  • 三段式产线:Wedge 展开 → HDA 执行 → 缓存/渲染输出,末段必须核对;
  • 缓存路径确定性是缓存识别的命门;
  • 失败隔离+可观测性:汇总失败,绝不盲跑;
  • 执行单元用冻结的 HDA,不用活网络;
  • 三问过滤:够多、够独立、会重跑,才值得上 TOP。

单机工厂建好了。第 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 前脚本扫描并强制重算该分支

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U