カスタム エバリュエータの概要

このセクションでは、Maya にカスタム エバリュエータを追加するために使用する API のクラスとメソッドについて説明します。カスタム エバリュエータにより、評価マネージャが DG ノードをスケジュールして実行する方法を変更することができます。Maya 2016 で導入されたシーン評価の変更を確認する場合は、詳細について、ホワイトペーパー『Improving Performance with Parallel Evaluation(英語)』(http://www.autodesk.com/maya-docs)を参照してください。

このセクションでは、評価マネージャで評価グラフを作成、パーティション化、およびスケジュールする方法を簡単に確認した後、新しい API クラスを紹介し、最後に新しい API クラスの使用を促進する簡単な例を説明します。devkit では追加の例を参照できます。

基礎知識

Maya 2016 で導入された評価マネージャ(EM)では、ディペンデンシー グラフ(DG)ノードの同時評価をサポートすることにより、再生と操作のパフォーマンスが向上しました。

EM では、シーンの異なるパーツのカスタマイズ処理を可能とする特別なエバリュエータを使用します。Maya 2016 では、次の 3 つのエバリュエータが用意されています。

エバリュエータ ディテール
デフォーマ 高密度のジオメトリをよりすばやく変形するために、GPU ハードウェアを活用
ダイナミクス シーンにサポートされない旧式ダイナミクスが含まれているかを検出し、検出した場合は並列評価を無効化
ルートを削減 ノードスケジュールのオーバーヘッドを減らすために評価中のアニメーション カーブをグループ化

評価マネージャの確認

EM ではシーンの評価時、グラフの構築、グラフのパーティション化、およびグラフのスケジュールという 3 つの主要手順が実行されます。それぞれを以下に説明します。

グラフの構築

従来の Maya の評価とは異なり、EM はフレームごとに何を評価するかを決定するために、ダーティな伝播に依存することはありません。代わりに、EM は DG ノード間の依存関係をエンコードする評価グラフ(EG)を作成します。

EG の構築中に、アニメートされた各ノードに対してプラグのリストを作成します。このリストには、特定のノード上の下流の従属で必要なすべてのプラグが含まれており、特定のノードが評価されるたびに、すべての上流の依存関係が確実に最新の状態に保たれます。

グラフのパーティション化

EG が構築されると、EM ではグラフのさまざまなパーツの評価方法を計算する必要があります。これを行うために、有効化されたエバリュエータが優先順にノードのサブグラフの所有権を要求することが可能となります。ノードを要求するには、エバリュエータは対象となるノードをマークする必要があります。

走査中に、1 つまたは複数の入力に接続した 1 つまたは複数の出力を持つ、あらゆるノード レベルのサイクルは、EM によってクラスタとしてグループ化されます。異なるエバリュエータによって要求されているサブグラフもクラスタに追加されます。

クラスタは単一のユニットとして一緒に評価され、相互に排他的です(つまり、1 つの評価ノードは最大 1 つのクラスタに属することができます)。したがって、すべてのクラスタのセットが、EG のパーティションを提供します。

クラスタは階層状にレイヤ化され、現在のクラスタがノードの評価に失敗した場合、コントロールは親クラスタに渡されます。優先順位の高いものから順に、クラスタのレイヤは次のとおりです。

レイヤ ディテール
カスタム カスタム エバリュエータ クラスタのレイヤ。ノードがカスタム エバリュエータのクラスタにある場合、そのエバリュエータがノードの評価に対する責任を持ちます。
サイクル 正確性を確保するために特別な評価が必要となることが多い DG ノードレベルのサイクルのレイヤ(コンストレイントなど)。
ベース シェーダ クラスタなしの既定レイヤ。ノードは、特別な処理が不要で直接評価されます。
注:グラフの構築とスケジュール中に、クラスタが作成および破棄されます。グラフが無効な場合は、クラスタが破棄されます。カスタム エバリュエータは、クラスタの初期化のみに依存し、コールバックを終了して、前のクラスタにはポインタをキャッシュすることはありません。現在、各クラスタは単一のユニットとして表現およびスケジュールされ、必要に応じてカスタム エバリュエータがノードを処理することができます。

グラフのスケジュール

パーティションの後、EM は適切な順序で評価するノードをスケジュールする必要があります。上流のノードがすべての従属の前に評価されるように、ノードはスケジュールされます。これ以外で、特定の順序による評価を確実に実行することはできません。

たとえば、単純なグラフでは、

ノード A は B より前に評価されます。より複雑なグラフでは、

A は B と C の前に評価されるように保証されますが、B と C の評価の正確なタイミングについては保証されません。B と C のスケジュール タイプに応じて、同時に評価される場合もあります。

注:ノードがスケジュール設定されていてもフリーズされた場合、その評価はスキップされます。