1

Ogre::RaySceneQuery同じシーンに の複数のインスタンスを使用すると、何か利点があるのだろうか。または、独自の特別なインスタンスが必要なものがある場合は?

4

1 に答える 1

1

通常、一度に実行するクエリは 1 つだけなので、毎回新しい RSQ インスタンスを使用する必要はありません。
複数のタイプのクエリを実行している場合でも、RSQ に毎回新しい光線を与える必要があるため、1 つ以上のインスタンスを使用してこれを実行しても違いはありません。

通常、コードは次のようになります。

Ogre::SceneManager* mSceneMgr;
Ogre::Ray ray; //whatever you want to query

Ogre::RaySceneQuery* mRaySceneQuery = mSceneMgr->createRayQuery(Ogre::Ray());
mRaySceneQuery->setRay(ray);
Ogre::RaySceneQueryResult &result = mRaySceneQuery->execute();

//loop through the result

テストする新しい光線ごとに、RSQ に新しい光線を与える必要があります。通常、光線はいくつかの座標 (プレイヤー、カメラなど) に依存しており、反復ごとに光線を更新する必要があります。

静的な rayがある場合、何かに依存せず、反復ごとに同じベクトルになるsetRay(Ogre::Ray)レイは、この特定のレイのみに別の RSQ インスタンスを使用する場合に呼び出しを保存できますが、これがクエリを実行する必要があるため、パフォーマンスが大幅に向上するか、さらに顕著になります。


考慮すべき点がもう 1 つあります。それは、クエリ マスクです。
すべてのエンティティは、レイ クエリでヒットできるかどうかを決定するバイナリ マスクを持つことができます。
あなたがこの構造を持っているとしましょう

enum QueryFlags {
  FRIENDS = 1<<0;
  FOES = 1<<1;
}

そして、何かが友人や敵に当たったかどうかをテストしたいすべてのフレーム。いくつかの可能性があります:

mRaySceneQuery->setQueryMask(FRIENDS | FOES)味方か敵かの両方を一度にチェックし、取得したすべての結果をチェックすることができます。1 つは 用、もう 1 つは 用の2 つのクエリを実行でき
ます。 2 つの RSQ を使用できます。1 つは味方用、もう 1 つは敵用です。このようにして、毎回への呼び出しを保存します。上記のように、これでパフォーマンスが大幅に向上するとは思えませんが、私は最後のオプションを好みます。executeFRIENDSFOES
setQueryMask

于 2014-01-02T17:29:27.333 に答える