我想知道如果我Ogre::RaySceneQuery
对同一场景使用多个实例是否有任何好处。或者如果有任何事情需要它自己的特殊实例?
问问题
471 次
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 回答