Есть ли причина создавать несколько экземпляров Ogre :: RaySceneQuery для одной и той же сцены? - PullRequest
1 голос
/ 04 октября 2011

Интересно, есть ли какие-нибудь преимущества, если я использую несколько экземпляров Ogre::RaySceneQuery для одной и той же сцены. Или если есть какие-то вещи, которые требуют своего особого экземпляра?

1 Ответ

1 голос
/ 02 января 2014

Обычно вы выполняете только один запрос за раз, поэтому нет необходимости каждый раз использовать новый экземпляр 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 каждый раз.Как и выше, я сомневаюсь, что это даст значительный прирост производительности, но я предпочитаю последний вариант.

...