【问题标题】:Is there reason to create multiple instances of Ogre::RaySceneQuery for same scene?是否有理由为同一场景创建多个 Ogre::RaySceneQuery 实例?
【发布时间】:2011-10-04 18:00:56
【问题描述】:

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

【问题讨论】:

  • 您不必多次支付初始化开销。我怀疑这真的很重要。除非您遇到内存或性能问题,否则我不会担心

标签: ogre3d ogre


【解决方案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-&gt;setQueryMask(FRIENDS | FOES) 同时检查两者,并检查每个检索到的结果是朋友还是敌人。
您可以对execute 进行两次查询,一次查询FRIENDS,另一次查询FOES
您可以使用两个 RSQ,一个用于朋友,另一个用于敌人。这样,您每次都保存对setQueryMask 的呼叫。如上所述,我怀疑这会显着提高性能,但我更喜欢最后一个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2016-04-01
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多