2011-10-04 30 views

回答

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新線每一個新的射線。通常光線依賴於一些座標(玩家,相機......),並且每次迭代都必須更新光線。

如果你有一個靜態射線,它不依賴於某種東西可以彼此相同矢量和每一次迭代如果使用其他RSQ實例這個特殊光線,你可以保存呼叫setRay(Ogre::Ray)曙光只是,但我懷疑這將是一個巨大的性能提升,甚至可以引起注意,因爲你仍然需要執行查詢。


還有一點你應該考慮:查詢掩碼。
每個實體都可以擁有一個二進制掩碼,用於確定是否可以通過射線查詢命中。
讓我們假設你有這樣的結構

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

,每幀你想測試,如果有什麼東西砸的朋友和/或敵人。有以下幾種可能性:

您可以一次檢查mRaySceneQuery->setQueryMask(FRIENDS | FOES)並檢查每個檢索結果,如果它是朋友或敵人。
您可能execute有兩個查詢,一個用於FRIENDS,另一個用於FOES
你可以使用兩個RSQ,一個給朋友,另一個給敵人。這樣您每次都可以撥打setQueryMask。如上所述,我懷疑這會帶來顯着的性能提升,但我更喜歡最後的選擇。

相關問題