Compiled blocks

目录

一,编译块 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插件

可轻松为编译循环或节点选择,可创建所有所需的节点且更新所有表达式引用;

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值