H16新機能 コンパイルブロック 3


こんにちは、篠島です。前回に引き続きコンパイルブロックの説明です。今回はコンパイルブロックが開発された経緯、メモリの最適化などの説明をしたいと思います。

 

Houdini でSOPをCookするときには、必ずインプットのジオメトリのコピーが作られ、それに対して処理をして新しいジオメトリを作ります。すなわち新しいデータがメモリにキャッシュされます。例えば下の図の様に最初のノードで100Mのデータを作ったとします。すると、SOPを追加する度に新しいジオメトリが作られその分メモリ消費量が増えていくことになります。下図はあくまでイメージなので、実際にSOPの数だけメモリが無駄に消費されるわけではなく、SOP内で変更が加えられた部分のみキャッシュするなどしてメモリ消費量をかなり抑えています。

 

なんでSOP毎にキャッシュするのか・・・というと、キャッシュすることでディスプレイフラッグを付けた時に一瞬で表示できるのです。これがキャッシュされていないと、SOPをクリックする度に、その上流のノードを全て再計算して表示しなければならず非常に効率が悪いのです。

 

しかし、メモリ使用量をいかに最適化したとしても、SOPを追加した時に発生する、インプットデータのコピーはどうしようもありません。データが巨大だとコピーにも時間がかかります。C++の観点から説明します。それぞれのSOPを関数だと例えると、関数に渡すデータが値渡し(データがコピーされる)になっています。これをどう効率化すればいいのか・・・というと、参照渡し(元のデータを直接編集)にすればいいわけですね。
よく理解できない人は「C++ 参照渡し 値渡し」などでGoogle検索してみましょう。

 

この参照渡しのようなデータのやり取りをどうやってHoudiniで実行するか・・・そこで現れたのがコンパイルブロックです。前回も話したとおり、コンパイルブロック内部は一つのノードのように振る舞います。なぜなら内部のSOPはキャッシュを作らずに、インプットのジオメトリキャッシュに直接変更を加えていっているからです。