Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/indyadmin/web/houdinifx/blog/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524
こんにちは、篠島です。前回説明したメモリを踏まえてコンパイルブロックを説明します。コンパイルブロックの並列処理ではなく、ノードをまとめて一つのノードの様に振る舞う部分について見てみます。
まずBoxを作り、適当にノードを繋げます。パフォーマンスモニタを確認すると、それぞれのノードの処理にどのくらいの時間がかかったのかが表示されます。それぞれのノードがちゃんと処理されているのが確認できます。要はSOP一つずつキャッシュを読み込み、作成しているということです。
それに対し、コンパイルブロックを使うと、コンパイルブロック内のノードは一つのノードになるためにパフォーマンスモニタには表示されずに、コンパイルブロックのノードだけが表示されています。これはどういうことかというと、コンパイルブロック内部のSOPはキャッシュを作らずに各SOPは直接前のノードが作ったデータに対して処理を加えていっています。そして最後に Block End Compile SOP の所で初めてジオメトリデータがキャッシュされます。違いを明確にするために、コンパイルブロック外側にTransform SOPを入れておきました。コンパイルブロック外のノードはパフォーマンスモニタに現れるのが確認できます。
コンパイルブロック内部はキャッシュがされない・・・と言うことはどういうことかというと、コンパイルブロック内部のSOPのディスプレイフラッグをONのにすると、HoudiniはそのSOPまでの上流ノードを全て計算し直さなければなりません。それもそのはず、なぜならキャッシュが無いのですから・・・。コンパイルブロック内部をクリックして表示させると、もちろんパフォーマンスモニタに内部のSOPが表示されます。
これが何を意味するか・・・というと、並列処理じゃなく、SOPをまとめる意味でコンパイルブロックを使った場合、もし内部のノードを表示してしまうとコンパイルの恩恵が減少してしまいます。
こういうノードをまとめる意味でコンパイルブロックを使うのは、インプットジオメトリが毎フレーム変形していて毎フレーム複雑なSOPネットワークを適用するときなどに使うと便利かと思います。動きのない固定したオブジェクトだと恐らくあまり恩恵は受けられないでしょう。