パラメータパフォーマンスの最適化

 
 
 

CParameterRefArray::GetValue などの関数は、パラメータの読み取りと書き込みを行う C++ コードの速度を速めることを目的としています。Softimage では、パラメータ値へのアクセスを速めるための多くの最適化が実現されています。 しかし、SDK ユーザには、高速なパラメータ アクセス コードを記述する方法に関する知識も必要です。ここで、C++ API のパラメータを活用するためのヒントを示します。

常にプライマリ オーナーからパラメータを取得する

Softimage SDK のパラメータには、ProjectItem·クラスを使用してアクセスします。このクラスは、大部分の SDK クラスの基礎であり、汎用的で再利用可能なコードの記述を実現します。 通常は汎用的なコードを記述するだけで間に合いますが、パラメータ アクセスに関しては、汎用的なコードはパフォーマンスを犠牲にしているとも言えます。 パフォーマンスを最適化するために、常にプライマリ オーナーからパラメータを取得することをお勧めします。プライマリ オーナーとは、言い換えれば、パラメータのすぐ上の親のことです。

たとえば、それぞれがパラメータを持ついくつかの子オブジェクトがあるカメラ オブジェクトについて考えてみましょう。カメラの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 の呼び出しによって、カメラ階層全体をナビゲートでき、カメラの下にネストされたすべてのパラメータ(プリミティブ、カメラ表示、キネマティクス、表示/非表示など)が収集されます。代わりに、位置 x パラメータを持つカメラのローカルの 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() );