StepFast
HOTE: StepFastアルゴリズムはQuickStepアルゴリズム(dWorldQuickStep関数)によってサポートされています。しかしながら、
使用法の詳細をのぞいて以下の議論もQuickStepは当てはまります。
使用法の詳細をのぞいて以下の議論もQuickStepは当てはまります。
ODEのdWorldStep関数はシステムをステップするために"大きなマトリックス"を使用します。システムが大きくなってしまうため低速でたくさんのメモリを要求します。StepFast1アルゴリズムは、別の手段として速度とメモリを益として正確さを犠牲にした、システムをステップする方法を提供します。これを使うためには、単にdWorldStepの代わりにdWorldStepFast1を呼びます。
The chart in figure 11 illustrates this speed advantage over the standard dWorldStep algorithm.
Figure 11: Speed advantage of StepFast.
グラフはステップの実行時間のためにシステムから除いた自由度(DOFs)数の関係です。dWorldStepアルゴリズムの実行時間はDOF’s removedの二乗に比例すると言えると思います。StepFast1アルゴリズムは、しかしながら、おおまかに比例です。なのでislandの増加すること(たとえば、車の大きな玉突き衝突、"ラグドール死体"の積み重ね、もしくは煉瓦の壁)でStepFast1アルゴリズムはdWorldStepよりもよくなります。これは、最悪のケースであっても、決まったフレームレートを維持するのにふさわしいということを意味します。
The graph of DOFs removed to memory looks quite similar (see figure 12).
Figure 12: Memory advantage of StepFast.
いつStepFast1を使用すべきか
いつStepFast1を使用すべきでないか
StepFast1を使用すべきではないいくつか特定の状況があります。一語で簡単に要約すると、正確さが速度やメモリよりも重要なときStepFast1は使用しないことです。この場合それを評価したいかもしれません。おそらく比較的かなりの数の繰り返し(20+)で、不確定さが目立つかどうか見ることができると思います。
それはどのように働くか
StepFast1を含む実験的なユーティリティ
まだ認められていないいくつかの実験的な関数はコードのStepFast1フローの一部としてODEへ加えられています。ほとんどは、最適化1ビットとしてbodyの自動無効、有効に関係があります。大体の考えは、ここにあります:
- bodyはそれが特定の(線形、角度)速度以下に落ちる時を働かなくすることの候補と考えられます。そして、AutoDisableThresholdと呼ばれています。速やかな遂行のために、計られる実際の速度は、bodyの速度の二乗です。それで、あなたが予想したより低い値で設定する必要があるかもしれません。0.003でデフォルトで、そしてtest_crashでよく機能します。
API
void dWorldStepFast1(dWorldID, dReal stepsize, int maxiterations);
StepFast1アルゴリズムを用いて、stepsize秒ごとにworldをステップします。実行するためのイテレーション数はmaxiterationsで与えます。
void dWorldSetAutoEnableDepthSF1(dWorldID, int autoEnableDepth); int dWorldGetAutoEnableDepthSF1(dWorldID);
StepFast1アルゴリズムによって使用されるAutoEnableDepthパラメータの設定・取得をします。
void dBodySetAutoDisableThresholdSF1(dBodyID, dReal autoDisableThreshold); dReal dBodyGetAutoDisableThresholdSF1(dBodyID);
StepFast1アルゴリズムによって使用されるbodyごとAutoDisableThresholdパラメータの設定・取得をします。
void dBodySetAutoDisableStepsSF1(dBodyID, int AutoDisableSteps); int dBodyGetAutoDisableStepsSF1(dBodyID);
StepFast1アルゴリズムによって使用されるbodyごとAutoDisableStepsパラメータを設定・取得をします。
void dBodySetAutoDisableSF1(dBodyID, int doAutoDisable); int dBodyGetAutoDisableSF1(dBodyID);
StepFast1アルゴリズムによって使用されるbodyごとAutoDisableフラグを設定・取得します。もし、doAutoDisableがゼロでないならば、auto-disablingは有効です。doAutoDisableがゼロならばauto-disablingは無効です。
以上