• 节点的删除 同时删除所有绑定要节点上的对象


     

    转载  节点的删除 - 同时删除所有绑定要节点上的对象

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

  • 相关阅读:
    js变量
    运行javascript的方式
    .Net 内存泄露
    .NET Reflector反编译的方法
    SVN 忽略获取和提交obj、bin文件夹
    SQL Server编程(06)触发器
    SQL Server编程(05)游标
    SQL Server编程(04)基本语法
    SQL Server编程(03)自定义存储过程
    SQL Server编程(02)自定义函数
  • 原文地址:https://www.cnblogs.com/minggoddess/p/1904300.html
Copyright © 2020-2023  润新知