CParameterRefArray::GetValue などの関数は、パラメータを読み書きする C++ コードの速度を向上させるためのものです。 Softimage では、パラメータ値へのアクセスを速めるための多くの最適化が実現されています。 しかし、SDK ユーザには、高速なパラメータ アクセス コードを記述する方法に関する知識も必要です。ここで、C++ API のパラメータを活用するためのヒントを示します。
Softimage SDK では、パラメータが、ProjectItem クラスを介してアクセスされます。 このクラスは、大部分の SDK クラスの基礎であり、汎用的で再利用可能なコードの記述を実現します。 通常は汎用的なコードを記述するだけで間に合いますが、パラメータ アクセスに関しては、汎用的なコードはパフォーマンスを犠牲にしているとも言えます。 パフォーマンスを最適化するために、常にプライマリ オーナーからパラメータを取得することをお勧めします。プライマリ オーナーとは、言い換えれば、パラメータのすぐ上の親のことです。
それぞれ独自のパラメータを持つ複数の子オブジェクトが含まれるインスタンスの Camera オブジェクトについて考えてみます。 カメラの位置 X を取得するために、次のような汎用的なコードを記述することができます。
Application app; Model model = app.GetActiveSceneRoot(); ProjectItem camera = model.GetChild(L"Camera"); Parameter posx = camera.GetParameters().GetItem("posx"); app.LogMessage( posx.GetValue().GetAsText() );
ProjectItem::GetParameters の呼び出しによって、カメラ階層全体をナビゲートでき、カメラの下にネストされたすべてのパラメータ(プリミティブ、カメラ表示、キネマティクス、表示/非表示など)が収集されます。 この方法ではなく、posx パラメータを保持するカメラのローカルな KinematicState オブジェクトから直接パラメータを取得した方が適切な場合があります。 これによって、Softimage でカメラのすべての子オブジェクトが検索されることはなくなり、位置 X が定義されているキネマティック プロパティのみが検索されるようになります。
Application app; Model model = app.GetActiveSceneRoot(); Camera camera = model.GetChild(L"Camera"); KinematicState ks = camera.GetKinematics().GetLocal(); Parameter posx = ks.GetParameters().GetItem("posx"); app.LogMessage( posx.GetValue().GetAsText() );
ProjectItem::GetParameterValue および Parameter::GetParameterValue は通常最小数のパラメータにアクセスするために使用されます。 アクセスしたノード パラメータすべてをキャッシュするためにターゲット オブジェクトの階層全体を検索する GetParameters とは対照的に、GetParameterValue は特定のパラメータのみを探し、パラメータが見つかると同時にその値を返します。
GetParameterValue ではキャッシュを使用しません。これにより、必要なのは 1 つのパラメータ値のみであるため、(大きくなりがちな)キャッシュを作成するために必要なオーバーヘッドを回避できます。 関係するパラメータの数が少ない場合は、GetParameterValue のみを使用してください。
Application app; Model model = app.GetActiveSceneRoot(); Camera camera = model.GetChild(L"Camera"); // Wrong way of getting a single parameter value. This // will traverse the entire camera parameter hierarchy and // cache all parameters Parameter fov = camera.GetParameters().GetItem(L"fov"); app.LogMessage( fov.GetValue().GetAsText() ); // Suggested way of getting a single parameter value. CValue val = camera.GetParameterValue(L"fov"); app.LogMessage( val.GetAsText() );