Houdini でアトリビュートを追加、Point (点・頂点)、Vertex (面単位頂点)、Primitive (面) などに値を追加する場合、従来 Attribute Create ノードが使われてきた。Attribute Create ノードは使い易い UI を提供する反面、シングルスレッドでデータ量に比例して処理時間が増加する。そこで登場したのが Wrangle ノード群。Wrangle ノードは、VEX というエクスプレッション言語が元になっていて、とっつきにくい印象を受けるが、完全にマルチスレッド化されていて、データが増えても処理時間は殆ど変わらない。
ここでは、従来 Attribute Create でしていたことを Attribute Wrangle を使ってどのように行うかを紹介する。
使用バージョン: Houdini 15.0.291
Attribute Create ノード
最初に、従来の Attribute Create ノードを使った方法をおさらい。
- Houdini を起動、Create タブで Grid を Ctrl クリック。Network パネルの中で、作成された grid_object1 の中に入る。
- grid1 の出力から、TAB->Attribute->Attribute Create を作成。
attribcreate1 が出来る。ちなみに確定時に Enter ではなく、Shift+Enter を押すと自動的に作成されたノードに表示フラグが移動する。これは H15 からの新機能。- Name を xamount に (予約語ではないので何でも良い)。
- Class は Point のまま
- Type を Integer (整数) に
- Size は 1 のまま
- 一番下の Value (値) に @ptnum と入力。これはVEX/Wrangle 言語を元にした Hscript の $PT に相当する点IDを返す変数。予約語。
Geometry Spreadsheet で Point の項を見れば、それぞれの点に対し、点 ID と同じ値が xamount のアトリビュート値としてアサインされていることがわかる。 - attribcreate1 ノードを MMB でクリックするとノードの情報が表示される。ジオメトリやアトリビュート情報、データサイズに加え、中央よりやや下にこのノードの Cook Time (演算時間) が 0.17ms かかったと表示されている。
- grid1 に戻り、Rows と Columns を 10x10 から 100x100 に変更。再度 attribcreate1 ノードを MMB でクリックすると、Cook Time は 4.72ms。
- 同じ要領で Rows と Columns を増やしていけば、演算時間は比例して増加していく。
Rows x Columns 総ポイント数 データサイズ (MB) 演算時間 (ms) 10 x 10 100 0.01 0.17 100 x 100 10,000 1.25 4.72 1000 x 1000 1,000,000 126.25 435.1 5000 x 1000 5,000,000 631.66 2,202 10,000 x 1000 10,000,000 1.23 (GB) 4,364 5,000 x 5000 25,000,000 3.09 (GB) 11,160
16GB の PC で 10,000 x 10,000 (1億ポイント) は厳しい…
Attribute Wrangle ノード
Wrangle ノードは、VEX を簡易なエクスプレッションで記述するためのノード。VEX とは Vector EXpression の略で、 SIMD (Single Instruction Multiple Data) の一種でマルチスレッドで効率よく演算を行うことが出来るスクリプト言語。実際にはランタイムでコンパイルされて実行される。
上で Attribute Create で行ったことと同じことを Attribute Wrangle ノードを使って行う。
- Houdini を一度終了して再起動。Create タブで Grid を Ctrl クリック。Network パネルの中で、作成された grid_object1 の中に入る。
- grid1 の出力から、TAB->Attribute->Attribute Wrangle を作成。
attribwrangle1が出来る。ちなみに確定時に Enter ではなく、Shift+Enter を押すと自動的に作成されたノードに表示フラグが移動する。これは H15 からの新機能。 - 上の Attribute Create と同じことをするには、VEXpression の部分に
i@xamount = @ptnum;
と入力し、フィールド外の部分をクリックしてリフレッシュ。
先頭の i は integer (整数) の意味。「@xamount」でアトリビュートを宣言、「= @ptnum」とすることで、各ポイント単位で ptnum の値をアサインしている。先ほど同様、値の確認は Geometry Spreadsheet で可能。
ちなみに、先頭の i を外して、
@xamount = @ptnum;
とし、Geometry Spreadsheet で xamount の値を確認すると、0.0, 1.0, 2.0, 3.0, ... とすべて実数 (デフォルト)でアサインされているのがわかる。明示的に実数で定義したい場合には、
f@xamount = @ptnum;
とする。f は float (浮動小数点) の意味。 - Attribute Wrangle の演算速度を正確に計るには、attribwrangle1 ノードではなく、その中にある Attribute VOP (attrvop1) ノードを確認する必要がある。
- attribwrangle1 を選択、RMB->Allow Editing of Contents メニューを実行して、このノード (実はデジタルアセット) のロックを解除
- ダブルクリックなり i キーなりを押して中に入る
- MMB でクリックしてノードの情報が表示
Rows x Columns 総ポイント数 データサイズ (MB) 演算時間 (ms) 10 x 10 100 0.01 10.89 100 x 100 10,000 1.25 3.56 1000 x 1000 1,000,000 126.25 30.47 5000 x 1000 5,000,000 631.66 208.91 10,000 x 1000 10,000,000 1.23 (GB) 553.12 5,000 x 5000 25,000,000 3.09 (GB) 532.42
Attribute Create に比べると、Attribute Wrangle 内の Attribute VOP の処理時間増加は非常になだらか。青が Attribute Create, 赤が Attribute Wrangle (VOP) 。
10x10 などデータ量が小さい場合には、Attribute Create の方が速いことがあるかもしれないが、データ量の増加に伴い差は開くだけ。2500万ポイントでは約20倍。
まとめ
今回はアトリビュート一個で比較したが、Attribute Create を使ってアトリビュートを n 個作りたい場合、Attribute Create が n 個必要になり、メモリ使用量も全体の演算時間もさらに n 倍となる。
Attribute Wrangle の場合、アトリビュートを n 個作る場合でも、一つのノードの中に複数の行に渡ったアトリビュートの定義が可能。演算時間は殆ど増えず、メモリ使用量は微増。よって、大規模なデータを扱う場合、可能な限り Attribute Wrangle を使うのが望ましい。
関連項目:
- VOP and Wrangle (1 から 3 まであり)
- H15 Poly Extrude
計測に関して:
- 使用した PC: Dell Precision M4700 (Core i7@2.7GHz 16GB RAM, Windows 7 Ultimate) Windows Experience Index で6.9
- grid1 の Rows と Columns を変更する際には、Geometry Spreadsheet を前面を出して Viewport は非表示。
0 件のコメント:
コメントを投稿