1.關於節點的刪除:
1.分析:
0.SceneManager從節點列表中刪除節點
1.要從父節點中刪除該節點.
2.基於Ogre設計的設計.SceneNode沒有提供銷燬movableObject對象的函數.但是有解綁與遍歷movable的能力.此問題簡單爲解綁movable
3.節點上一般都擁有一系列的MovableObject對象.綁定在其上的MovableObject也應該被銷燬.
4.SceneNode上還可以有ChildSceneNode.因此.這些ChildSceneNode也應當被銷燬
5.內存的釋放
2.解析Ogre提供的功能:
1.SceneManager::destroySceneNode:
1.從父節點清除該節點.不再對其更新. -- 解決了問題1
2.delete 該節點. -- 解決了問題5 -- 由於在析構函數裏對所有object進行了解綁.所以同時也解決了問題2
3.從節點列表中移除該節點 -- 解決問題0
2.SceneNode::detachAllObjects:
1.對所有movableObject解除綁定 -- 解決問題2
3.SceneNode::getAttachedObjectIterator:
1.獲得movableObject的迭代器 -- 可以用來解決問題3
4.SceneNode::removeAndDestroyAllChildren:
1.調用SceneManager對每個子節點進行刪除.可解決該子節點的問題0,1,5.但此函數沒什麼用.
5.SceneManager::destroyMovableObject:
1.進行所有類型的movableObject的刪除.解決問題3
// SceneManager::destroyEntity:destroyCamera...等等
// 1.不能解決所有movableObject的刪除.
3.綜上.
1.對綁定在節點上的movableObject的刪除與所有子節點的刪除是主要問題.
2.對每個節點:
1.遍歷所有子節點.對子節點進行刪除(每個節點都是相同的處理.)
2.遍歷並刪除所有movableObject對象 -- 解決問題3
3.SceneManager::destroySceneNode -- 解決問題0,1,2,5
4.實現:
// 從vim複製過來...代碼變形...
void SceneManager::DestroySceneNode( Ogre::SceneManager* pSceneManager, Ogre::SceneNode *pSceneNode )
{
// 遍歷並刪除所有movableObject對象
Ogre::SceneNode::ObjectIterator iterMovableObject = pSceneNode->getAttachedObjectIterator();
while ( iterMovableObject.hasMoreElements() )
{
// 不清楚沒把movableObject從節點解綁.刪除節點會不會有問題。應該不會纔對...
pSceneManager->destroyMovableObject( iterMovableObject.getNext() );
}
// 遍歷刪除子節點
Ogre::SceneNode::ChildNodeIterator iterChild = pSceneNode->getChildIterator();
while ( iterChild.hasMoreElements() )
{
DestroySceneNode( pSceneManager, (Ogre::SceneNode*)iterChild.getNext() );
}
// SceneManager::destroySceneNode -- 解決問題0,1,2,5
pSceneManager->destroySceneNode( pSceneNode );
}