2011-10-04 1 views
1

Je me demande s'il y a des avantages si j'utilise plusieurs instances de Ogre::RaySceneQuery pour la même scène. Ou s'il y a des choses qui nécessitent sa propre instance spéciale?Y a-t-il des raisons de créer plusieurs instances de Ogre :: RaySceneQuery pour la même scène?

+0

Vous n'aurez pas à payer pour les frais généraux d'initialisation plusieurs fois. Je doute que ce soit vraiment important. Je ne m'inquiéterais pas à moins d'avoir des problèmes de mémoire ou de performance – Jay

Répondre

1

Habituellement, vous n'exécutez qu'une seule requête à la fois, il n'est donc pas nécessaire d'utiliser une nouvelle instance RSQ à chaque fois.
Même si vous effectuez plusieurs types de requêtes, vous devez attribuer un nouveau rayon au RSQ à chaque fois, il n'y aura donc aucune différence si vous utilisez une ou plusieurs instances.

Habituellement le code ressemble à ceci:

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 

Pour chaque nouveau rayon que vous voulez vous tester devez donner RSQ le nouveau rayon. Habituellement, les rayons dépendent de certaines coordonnées (le joueur, la caméra, ...) et vous devez mettre à jour les rayons à chaque itération.

Si vous avez un rayon statique , un rayon qui ne dépend pas de quelque chose et sera le même vecteur chaque itération, vous pouvez enregistrer l'appel à setRay(Ogre::Ray) si vous utilisez une autre instance RSQ pour ce rayon spécifique seulement, mais je doute que ce sera un énorme coup de pouce de performance ou même perceptible que vous avez encore à exécuter la requête.


Il y a un autre point à considérer: les masques de requête.
Chaque entité peut avoir un masque binaire qui détermine si elle peut être frappée par une requête de rayon.
Supposons que vous avez cette structure

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

et chaque image que vous voulez tester si quelque chose a frappé un ami et/ou un ennemi. Il y a quelques possibilités:

Vous pouvez vérifier pour les deux à la fois avec mRaySceneQuery->setQueryMask(FRIENDS | FOES) et vérifier chaque résultat récupéré s'il s'agit d'un ami ou d'un ennemi.
Vous pouvez execute deux requêtes, une pour FRIENDS et une seconde pour le FOES.
Vous pouvez utiliser deux RSQ, un pour les amis et un second pour l'ennemi. De cette façon, vous enregistrez un appel à setQueryMask chaque fois. Comme ci-dessus je doute que cela donne un gain de performance significatif, mais je préfère la dernière option.

Questions connexes