目录
一,编译块 Compiled Block
二,编译循环
三,调用编译块 Invoke
四,Tips and notes
一,编译块 Compiled Block
在几何体网络内,可将网络的一部分放入编译块(compiled block)内(其内所有节点应是可编译的),可使块行为像一个节点一样;这对网络如何工作强加了许多限制,但也在适当的条件下带来巨大的好处:
- 主要好处是多线程的for-each loops;在大量独立的piece上运行相同的节点块,编译块会让houdini发布在多个核上;
- 另一好处是更高效的使用OpenCL;通常,即使一个节点处理几何体(在显卡上),在每节点后几何体也必须复制回主内存(由于其他节点可能会访问它);然而在编译块内,许多基于OpenCL的节点可在处理数据时将数据保留在显卡上,无需将其复制回,从而提高了速度;
- 在普通网络内,理论上每个阶段会复制其正在处理的几何体;在实践中,有很多优化可使其高效,但这仍然有成本;在编译块内,节点可在同一几何体上原位工作,因为不允许外部引用;这可以为编译块提供额外的加速;
限制
- 仅可使用可编译的节点;
- 不可使用stamp()表达式;
- 不可使用局部变量,每组件表达式,如需对每组件操作需使用基于VEX的节点,如attribute wrangle;
- 不可使用通过名称引用的内部几何体,如npoints("/obj/sphere1") ,应使用spare inputs替代;可通过路径引用通道值,如ch("../sphere1/tx"),但不能读取几何体,如point表达式;
- 不可读取直接的输入端口,如point(0, …) or npoints(0),使用spare inputs;
- 禁用/隐藏的参数不可计算;
- 不支持for each节点的stop条件;
编译块不报错也不代表结果正确:
hscript command和python expression,在循环迭代中会烘焙成一个值不会在循环中变化;
//python表达式 hou.node("/obj/geo1/metadata").geometry().attribValue('iteration')
如编译块内有用到不可编译的节点但没有用到,可勾选Delay Incompatible Node Errors Until Cooked(运行时识别);
如一些节点不能被编译而编译失败,可勾选Fallback to Traditional Cook If Compile Fails,退化为常规非编译计算;
- 错误发生在编译阶段,才可退化执行;
- 如勾选Delay Incompatible Node Errors Until Cooked(仅在运行时才识别不可编译的节点),无法退化执行;
编译块可以由多个Block End Compile,应设置Primary Path;
二,编译循环
是把循环放在编译块内,而不是把编译块放在循环内;
在for-each循环的最高级别循环(最外层循环)的终端节点上,打开Multithread when Compiled参数,告诉houdini将不同循环迭代发布到不同核心上;仅在最外层循环上打开此参数,避免发布任务的激增;
Nesting blocks
使用编译块和循环时,注意在每个块的“边界”处正确封装和嵌套每个块的Begin/End节点;普通cook是有效的,houdini会re-cook每迭代的路径;但编译块内的循环是作为独立的单元被编译的,必须在自己的Begin/End节点内;
Spare inputs
在编译块内的几何体表达式,不能引用节点的直接输入,也不能通过名字引用;不能有任何的动态表达式;任何需要从其他SOP读取数据的SOP,必须在cook前静态地确定,不是在cook期间在确定;
可添加spare input,去指向引用的节点;spare input在编译块运行前会re-cook;
三,调用编译块 Invoke
运行其他地方定义的编译块,以处理节点的输入,好像被引用的编译块被连入;
在两个方面有用:
- 可在网络不同的地方复用块功能,不必复制或引用节点;
- 可创建以资产,其参数接受编译块的引用;
Inputs
- 可指定许多输入,每个输入可覆盖block begin compile的输入;
- 输入必须匹配block begin compile的名字,如没有匹配的输入将使用编译块原始的输入;
四,Tips and notes
- spare input也有用于在wrangle节点内引用外部几何体(超过wrangle节点的四个输入);
- 在编译块内的打开显示flag,将会非编译cook;必须在block end节点后以编译;
- 可打开badge以查看节点是否为可编译的;
HoudiniEasyCompileBlock_v0_5_6插件
可轻松为编译循环或节点选择,可创建所有所需的节点且更新所有表达式引用;