私のシーンには、動的オブジェクトのスタックが多数あります。シミュレーションが開始されると、これらが「解決」して眠っている島になるまでにしばらく時間がかかります。これは、最初の数秒間、パフォーマンスに大きな影響を与えます。
すぐにスリープ状態になるようにスタックを配置するテクニックはありますか?
私はPhysXを使用しています。
私のシーンには、動的オブジェクトのスタックが多数あります。シミュレーションが開始されると、これらが「解決」して眠っている島になるまでにしばらく時間がかかります。これは、最初の数秒間、パフォーマンスに大きな影響を与えます。
すぐにスリープ状態になるようにスタックを配置するテクニックはありますか?
私はPhysXを使用しています。
使用できます
NxActor::putToSleep();
始めるとき。これにより、シーンのパフォーマンスが大幅に向上します。ただし、スタック上に誤って配置されたオブジェクト (フライング キューブなど) がある場合、別の動的オブジェクトが衝突するまで落下しません。
このアプローチは、アクティブに移動するオブジェクトでは機能しないようです。たとえば、動的オブジェクトがシーンで 5m/s の速度で移動していて、強制的にスリープさせようとすると、putToSleep は機能しません (最初にオブジェクトの速度を 0 に設定してから、寝る)
強制的にスリープさせて動的アクターを無効にする必要がある場合の回避策を次に示します。
void setDynamicActorState(NxActor& actor, bool disabled)
{
if (nxActor.getNbShapes() > 1)
{
for (int i = 0; i < nxActor.getNbShapes(); i++)
{
nxActor.getShapes()[i]->setFlag(NX_SF_DISABLE_COLLISION, disabled);
}
}
else
{
if (disabled)
nxActor.raiseActorFlag(NX_AF_DISABLE_COLLISION);
else
nxActor.clearActorFlag(NX_AF_DISABLE_COLLISION);
}
for (int i = 0; i < nxActor.getNbShapes(); i++)
{
nxActor.getShapes()[i]->setFlag(NX_SF_DISABLE_SCENE_QUERIES, disabled);
}
if (disabled)
{
nxActor.raiseBodyFlag(NX_BF_KINEMATIC);
nxActor.putToSleep();
}
else
{
nxActor.clearBodyFlag(NX_BF_KINEMATIC);
nxActor.wakeUp();
}
}
これにより、アクター、コリジョン、シーン クエリなどのすべてが無効になります。私はこの戦略を使用して、すべてのアクターをシーンにプリロードし、非アクティブなオブジェクトを非表示にします。彼らの番が来たら、それらを有効にし、他の人を無効にします。すべてのアクターを一度にロードすると、メモリが消費される可能性があることに注意してください。
私は PhysX に詳しくありませんが、それがどのように機能するかについて、知識に基づいた推測をすることができます。たとえば、PhysX がオブジェクトを「解決済み」と宣言する方法に応じて、機能する場合と機能しない場合がある 1 つまたは 2 つのアイデアを次に示します。
ブロックが実際に動いている場合は、おそらく最初の位置に不正確さがあり、安定する余地があるためです。たとえば、紙の上に設計されたものに頼るのではなく、解決された構成を保存することによって、その不正確さを減らす方法があるかもしれません。それらは最終的に停止するため、散逸力 (摩擦など) が働いている必要があり、パラメーターが必要です。ブロックが蜂蜜に浸されているかのように、最初は高さを上げてから、ダイヤルを下げます。
それらが実際に動いているかどうかにかかわらず、ブロックの巨大なぎくしゃくした塔の上部にあるブロックは、その下のすべてのブロックが落ち着くまで落ち着くことはできないため、揺れをシミュレートするためのすべての計算は完全に無駄になります--その不確実性が下のブロックをどのように乱すかは言うまでもありません。そのため、一番下のオブジェクトを最初に配置し、それらを解決させてから、(彼らが言うように「コース」で) 上に向かって作業して、煉瓦工になってみてください。
排除できない場合は、覆い隠してください。最初の数秒間はブロックを非表示にして、ブロックが解決されたらカーテンを上げることができるかもしれません。これは物事を速くするわけではありませんが、見栄えを良くするかもしれません。