節點的刪除 - 同時刪除所有綁定要節點上的對象

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 );
    
   }

發佈了15 篇原創文章 · 獲贊 10 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章