はじめに
Cookは、TouchDesignerを扱ううえでとても大切な概念だと感じたため、和訳しておきました。
少々訳しづらい部分もあったため、意訳した部分もありますがご容赦ください。
尚、日本語訳が間違っている場合はバシバシ修正入れてもらって構いません。
参考ページ : Cook - Derivative TouchDesigner099 Wiki
Cook
Cookとは、ネットワークにあるオペレータが計算を走らせている状態のことを指す用語です。
オペレータをミドルマウスクリックすることで、最後にいつCookされたか、TouchDesignerを起動してから何回Cookされたかを閲覧することができます。
TouchDesignerのオペレータは、オペレータの機能が必要とされたときのみCookされるようになっています。
つまり、毎フレームすべてのノードがCookされているわけではないということです。(Cookの順序参照)
一方で毎フレームCookされるものもあり、以下がその例となります(Cookの強制参照)
- ビュアーフラグがOnに設定されているオペレータ
- 最後にCookされてから値が変更されたオペレータに接続されているオペレータ
- レンダリングに関連しているパネルオペレータ
- TouchDesignerの外部にネットワークでデータを送信しているオペレータ
ノード間のワイヤーがアニメーション表示されている場合は、上流(左側)のノードがCookされていることを意味し、下流ノード群はCookしている場合としていない場合(単にCookを要求しているだけ)があります。
PerformanceMonitorダイアログでは、1フレーム中に何がCookされたかを表示することができます。
30FPSか60FPSでアプリケーションを実行したい場合は、極力Cookされるノード数を減らす必要があるでしょう。
Cookの詳細
何がCookを発生させるのか?
オペレータがCookされるには、以下2つの条件が真である必要があります。
- Cook Request を持つ (オペレータをCookするように求める動作)
- Cook Reason を持つ (なぜCookされる必要があるのか)
Cook Request
- オペレータの出力に接続されたオペレータがCookを要求しているとき
- パラメータでオペレータを参照しているものがCookを要求しているとき
- ビューアがノードのデータを表示しているとき
- CHOPまたはDATが値をエクスポートしようとしているとき
- オペレータのcook()メソッドを呼んだとき
Cook Reason
- 入力されいているノードの一つがCookされた
- パラメータを通して参照しているノードがCookされた
- ノードのパラメータが変更された
- 特定のスクリプティングコマンドがノード上で実行された
- エクスプレッションの結果が変化した
- オペレータが参照する変数の値が変更された
- エクスプレッション内で参照されたオペレータがCookされた
- オペレータが時間依存のもので、入力やパラメータの変化にかかわらず毎フレーム異なる値を出力できる(TimeSlice CHOP, VideoDeviceIn TOPなど)場合
- パネルコンポーネントで、ユーザーが操作できる場合
オペレータがCookリクエストを受け取ったとき、そのオペレータに接続されているすべての入力に対しても、実際にCookされるかに関わらず、Cookリクエストを送信します。
入力のうちのどれかがCookされる場合、下流オペレータはCook Reasonが与えられた上でCookされます。
入力のすべてがCookされないのであれば、下流オペレータは利用可能なCook Reasonを探索します。
Cook Reasonが発見されなければ、オペレータはCookされません。(PerformanceMonitor上でも出現しません)
例えば、デフォルト状態のConstant TOP(1つのチャンネルで、エクスプレッションなし)のビュアーを見ていたとします。
このノードは定期的ににCookリクエストを受けています(例えば毎フレームUIが再描画されている状態です)。
しかし、このノードはCook Reasonを持っていないため、Cookされません。
Cookの順序
TouchDesignerは**"プルシステム"**を採用しています。
よくある間違いに、TouchDesignerのCookは上流から下流に流れるというものがあります。
例えば、Math CHOPに接続されたConstant CHOPがあるとします。
ほとんどの人はConstant CHOPの値を変更すると、Math CHOPが強制的にCookされると勘違いしています。
しかし、すべてのオペレータはデータが要求される場合にのみCookされます。
そのため、Constant CHOPのパラメータが変更されている間は自身を**Dirty(汚い)**な状態であるとみなしますが、
何かがこのデータにアクセスしようとしするまでCookを行いません。
つまり、Math CHOPが値を要求するまでConstant CHOPはCookされないのです。
Constant CHOPは、ビュアーがOnになっている、言い換えれば、ユーザーがそのオペレータのデータを見ようとしたなどほかの理由でCookされることもあります。
Cookの強制
いくつかのオペレータ、特にMovie Out TOP、Touch Out OP, その他Out OPのように、パラメータの変更や入力の変化にかかわらず毎フレームCookされるオペレータも存在します。
この動作は、ムービー、ネットワークパイプなどの出力の受信側が連続したデータストリームを取得できることを保証しています
また、Render TOPや~In OPのような特別なオペレータの場合は、入力やパラメータが変更されていなくてもCookします。
(単なるIn CHOPやIn SOPは除く、Device Inなどです)
レンダリングなどに際しては、Cookをするかどうかの判定にたくさんの入力の変更を監視する必要がありますが、
(Render TOPであれば、マテリアル、ジオメトリの位置、ジオメトリのレンダーフラグなど)
シーンでは常に変化が発生している為、強制的に毎フレームCookさせ余計なCook Reasonの探索が走らないようにすることで、計算時間を99%節約しています。
訳してみての感想
結局、知りたいことはわかりませんでした。(笑)