目錄
一,編譯塊 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插件
可輕松為編譯循環或節點選擇,可創建所有所需的節點且更新所有表達式引用;