2011-10-04 3 views
1

동일한 장면에 Ogre::RaySceneQuery의 여러 인스턴스를 사용하면 어떤 이점이 있는지 궁금합니다. 아니면 특별한 것을 필요로하는 것이 있다면?동일한 장면에 대해 Ogre :: RaySceneQuery의 다중 인스턴스를 만드는 이유가 있습니까?

+0

초기화 오버 헤드를 여러 번 지불하지 않아도됩니다. 나는 그것이 정말로 중요하다고 생각하지 않는다. 기억이나 성능에 문제가 없다면 걱정하지 않아도됩니다. – Jay

답변

1

일반적으로 한 번에 하나의 쿼리 만 수행하므로 매번 새로운 RSQ 인스턴스를 사용할 필요가 없습니다.
여러 유형의 쿼리를 수행하는 경우에도 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에게 새로운 광선을주고있다 테스트 할 각각의 새로운 레이 :

보통 코드는 다음과 같이 보인다. 일반적으로 광선은 어떤 좌표 (플레이어, 카메라, ...)에 의존하며 광선을 각 반복마다 업데이트해야합니다. 경우

당신은 정적 레이, 뭔가에 의존하지 않고 각각 같은 벡터 모든 반복이 특정 선에 대한 또 다른 RSQ 인스턴스를 사용하는 경우가 setRay(Ogre::Ray)에 대한 호출을 절약 할 수있을 것입니다 선이 그러나이 쿼리가 여전히 성능 향상에 큰 도움이 될지 의심 스럽습니다.

고려해야 할 또 다른 사항은 쿼리 마스크입니다.
모든 엔티티는 광선 쿼리에 적중 될 수 있는지 여부를 결정하는 바이너리 마스크를 가질 수 있습니다.
의 뭔가가 친구 및/또는 원수를 칠 경우이 구조

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

모든 프레임 싶어하는 시험이 있다고 가정하자. 몇 가지 가능성이 있습니다 :

mRaySceneQuery->setQueryMask(FRIENDS | FOES)으로 한꺼번에 확인하고 친구 또는적일 경우 검색된 결과를 모두 확인하십시오.
두 개의 쿼리 execute, FRIENDSFOES에 대한 두 개의 쿼리가 있습니다.
두 개의 RSQ를 사용할 수 있습니다. 하나는 친구를위한 것이고 다른 하나는 적을위한 것입니다. 이렇게하면 매번 setQueryMask 번으로 전화를 걸 수 있습니다. 위와 같이 나는 이것이 상당한 성능 향상을 가져올 지 의심 스럽지만, 나는 마지막 옵션을 선호한다.