是否有理由为同一场景创建多个Ogre :: RaySceneQuery实例?

时间:2011-10-04 18:00:56

标签: ogre3d ogre

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

1 个答案:

答案 0 :(得分: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。如上所述,我怀疑这会带来显着的性能提升,但我更喜欢最后一个选项。