On this page |
概要 ¶
TOPs Feedback Loopブロックは、一連の 直列による実行 工程を 何回も 実行することができます。
TOPネットワークは既に並列ループのような挙動をしています。 というのも、TOPネットワークはスケジューラの設定に基づいて可能な限り同時にたくさんのワークアイテムを実行します。 つまり、“入力別に同じアクションを繰り返す”挙動はTOPネットワークの挙動そのものなので、通常ではループを構築する必要がありません。
場合によっては並列ではなく直列に一連の工程を実行して、前のワークアイテムの出力をそれ以降のワークアイテムの入力として使用したいことがあります。 単純なシミュレーションなら、このような処理は既にROP Fetchノードを使えば制御することができます。このROP Fetchは同時に1ジョブ1フレームとして実行するバッチを生成することができます。
複数のノードが絡んだループまたはループさせる回数がまだわからないといったもっと複雑な使い方になると、 フィードバックループ を使用した方が良いです。
フィードバックループのブロック内では、TOPネットワークはノード毎にワークアイテムを実行するのですが、下流のワークアイテムが上流のワークアイテムに依存した状態で、それらのワークアイテムを直列に実行します。 そして、1回目のループですべてのワークを完了させた時に、そのブロックに2回以上のループ回数が指定されていれば、Beginノードに戻って次のループに進みます。
Tip
設定によっては、フィードバックループのブロックは、並列で 複数の直列ループ を実行する こともできます 。
例えば、1回ずつ一握りのビー玉を瓶に詰めていくRBDシミュレーションを実行するとします。 この処理全体を単一シミュレーションで実行することができますが、瓶の底に積み上がっていくビー玉は安定せず、次々にシミュレーションされるオブジェクトの数が増え続けていきます。 これを管理する1つの方法は、1回目に詰める一握りのビー玉に対してRBDシミュレーションを実行し、その結果を2回目のシミュレーションの静的オブジェクトとして使用することです。 3回目のシミュレーションでは、1回目と2回目のシミュレーションの結果を合わせたビー玉を静的オブジェクトとして使用します。それ以降のシミュレーションも同様です。 TOPsでは、ROP GeometryとFeedback Loopをループブロック内で使用することで、このような処理が可能になります。
(Feedback Loopはサービスブロックの実装でも使用します。その場合、ワークアイテムはサービスプロセスに割り当てられ、深さ優先順で順々に実行されます。)
How to ¶
Feedback Loopブロックを作成する ¶
-
TOPネットワークエディタで⇥ Tabを押して For-Loop with Feedback を選択します。
このツールはBlock Begin FeedbackノードとBlock End Feedbackノードを配置します。
-
Block Begin Feedbackノードを選択します。パラメータエディタで、反復回数の指定方法を選択します:
-
デフォルトでは、 Iterations パラメータで指定された反復回数だけループが実行されます。Block Begin Feedbackノードに上流のワークアイテムが接続されていれば、その入力のワークアイテム毎にiterations回だけループが実行されます。
例えば、指定した反復回数でシーンを何回も構築していくようなループ(例えば、概要で説明した“ビー玉を瓶に落とす方法”)で使います。 Block Begin FeedbackノードにWedgeノードを接続すれば、そこから生成されたワークアイテム毎にループを繰り返すことができます。
-
Block Begin Feedbackノードに静的なワークアイテムが含まれていれば、 Iterations from Upstream Items を有効にすることができます。これは、反復回数に上流のワークアイテムの数を設定します。これによって、入力のワークアイテム毎に1回だけブロック内の一連の工程が繰り返されます。
例えば、ディレクトリ内のすべてのファイルをリストするFile Patternノードとそのファイル毎に反復するループブロックを使用することで、その内容を一時ファイルに追加していくことができます。
-
-
Block Begin Feedbackノードが動的にワークアイテムを生成する場合、Block End Feedbackノードの Use Dynamic Partitioning も有効にしなければなりません。
-
そのBeginノードとEndノードの間にノードを接続することで、それらのノードをループの一部にすることができます。
このループを可視化するために、Houdiniはブロック内のノードを囲んだ境界を描画します。
ループ内のワークアイテムに基づいて副タスクを並列でクックする ¶
ループ内のノードからループ外のプロセッサに接続した場合(つまり、ループのEndノードに接続しなかった場合)、そのプロセッサのワークアイテムは、ループ内のワークアイテムに基づいて生成されるようになりますが、 通常通りに並列でスケジュールが組まれるようになります。
これは、ループ内のワークアイテムに基づいているもののループさせる必要のない“副タスク”で役立ちます。 例えば、ループ内では画像を生成してからその画像を制御していきたいような場合では、ループ外ではその生成された画像のサムネイルを並列で生成することができます。
Tipsとメモ ¶
-
フィードバックループにはどのプロセッサノードも使用することができます。現在のところ、フィードバックループ内では動的なパーティショナーを使用することは できません 。パーティションに同じループ回数目からのワークアイテムのみを含める場合であれば、 静的な パーティショナーを使用することが できます 。別のループ回数目のワークアイテムを無理やりパーティション化すると、そのパーティションノードはエラーを報告します。
-
ブロックのBeginノードとEndノードは、その関係性をわかりやすくするために同じカラーを設定してください。For-Loopツールで配置されたデフォルトのノードのカラーはオレンジですが、そのノードのカラーを変更することができます。これは、入れ子化したループと区別するのに役立ちます。
ブロックを囲んだ境界は、Endノードのカラーと同じになります。
-
Beginノードは、ループさせるワークアイテムを生成するプロセッサです。
-
各ワークアイテムは、同じループの前のワークアイテムに依存し、その反復回数とループ番号を識別するためのアトリビュートを持っています。
Block End Feedbackノードは、関係しているループの反復に基づいてワークアイテムをパーティション化するパーティショナーです。 フィードバックループ内のノードは自由に必要な数だけワークアイテムを追加していくので、パーティショナーはそれらのワークアイテムを収集することができて便利です。 Beginノード内の2回目のループのワークアイテムは、1回目のループのパーティションに依存します。それ以降のループも同様です。 ループが動的にワークアイテムを生成する場合、そのBlock End Feedbackノードの Use Dynamic Partitioning も有効にしなければなりません。
-
フィードバックブロック外のノードを、フィードブロック内の複数入力を持ったノードに接続することができます。