1

我想知道如果我Ogre::RaySceneQuery对同一场景使用多个实例是否有任何好处。或者如果有任何事情需要它自己的特殊实例?

4

1 回答 1

1

通常您一次只执行一个查询,因此无需每次都使用新的 RSQ 实例。
即使您正在执行多种类型的查询,您也必须每次都为 RSQ 提供一条新射线,因此如果您使用一个或多个实例执行此操作不会有任何区别。

通常代码看起来像这样:

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 提供新射线。通常光线依赖于一些坐标(玩家、相机……),你必须在每次迭代时更新光线。

如果您有一条静态光线,一条不依赖于某些东西的光线,并且每次迭代都是相同的向量,setRay(Ogre::Ray)如果您只对这个特定光线使用另一个 RSQ 实例,您可以保存调用,但我怀疑这个由于您仍然必须执行查询,因此将极大地提升性能甚至引人注目。


您还应该考虑另一点:查询掩码。
每个实体都可以有一个二进制掩码,用于确定它是否可以被射线查询命中。
假设你有这个结构

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

以及您想要测试的每一帧是否击中了朋友和/或敌人。有几种可能:

您可以同时检查两者,mRaySceneQuery->setQueryMask(FRIENDS | FOES)并检查每个检索到的结果,如果它是朋友还是敌人。
您可以execute进行两个查询,一个FRIENDS用于FOES.
您可以使用两个 RSQ,一个用于朋友,另一个用于敌人。这样,您setQueryMask每次都保存一个呼叫。如上所述,我怀疑这会显着提高性能,但我更喜欢最后一种选择。

于 2014-01-02T17:29:27.333 回答