查看: 2458|回复: 6

请教group的removeChild的相关问题

[复制链接]

该用户从未签到

发表于 2011-3-7 12:23:08 | 显示全部楼层 |阅读模式
我先把我的具体问题给描述一下吧:
    我从osg::MatrixTransform类派生出一个新类CPart类,这个CPart类中我新添加了许多我要的信息以及一些设置和获得这些信息的方法。具体出问题的代码部分是这样的:
   

  1. //场景树的更新部分
  2. app->mOSG->mRoot->removeChild(app->mOSG->mt19);
  3. app->mOSG->mRoot->removeChild(app->mOSG->currentCollisionMt);//把mt19、currentCollisionMt脱离树根

  4. app->mOSG->tempDynamicMt->addChild(app->mOSG->mt19);
  5. app->mOSG->tempDynamicMt->addChild(app->mOSG->currentCollisionMt);//将他们挂到临时动态节点上去

  6. app->mOSG->mRoot->addChild(app->mOSG->tempDynamicMt);//再把临时动态节点挂到树根上
复制代码

    上述代码中的mt19、currentCollisionMt、tempDynamicMt都是CPart类型的指针,里面的信息我在初始化的时候都设置好了,现在的情况是这样的:
   我通过设置断点的方法看到,在没有执行removeChild方法之前,mt19里面的信息都是有的,如下图:
    之前的mt19.jpg
   而一旦执行完removeChild方法,mt19l里面的信息就像被清空了一样,如下图:
   

之后的mt19

之后的mt19

   所以当程序再往下执行至addChild(app->mOSG->mt19)的时候就中断了。

   我的理解:
    (1)removeChild不是只是将该节点以及它的子节点从场景中移除么?也就是说通过场景树来查找这个节点肯定是找不到的,但是该节点的指针依旧是存在的,该指针所对应的内存中的信息都不应该被清空的吧?
    (2)之前其实在QQ群里也问过这个问题,有位朋友的回答和我的理解是一致的,只不过之前做的时候还没有创建继承自osg::MatrixTransform类的CPart类,也就是说mt19这些还是osg::MatrixTransform类型的指针。我不清楚的是,继承了一个新类会对这个函数有什么影响么?

    谢谢各位大侠了~~~

该用户从未签到

 楼主| 发表于 2011-3-7 12:29:15 | 显示全部楼层
这个图直接看可能太小了,看不清楚,鼠标点一下就放大了,就可以看清楚了,不好意思啊

该用户从未签到

发表于 2011-3-7 12:47:15 | 显示全部楼层
我觉得这个问题应该是在你removeChild的时候指针指向的内存信息已经释放掉了。
app->mOSG->tempDynamicMt->addChild(app->mOSG->mt19);
当你removeChild之后已经没有智能指针指向mt19所指向的对象,因此智能指针将其释放了。
你先进行后面的添加然后在执行remove或者remove前先用个智能指针接收下mt19然后进行后面的操作。
也不知道能不能解决你说的问题,试试吧!

该用户从未签到

发表于 2011-3-7 12:53:15 | 显示全部楼层
removeChild不是只是将该节点以及它的子节点从场景中移除么?也就是说通过场景树来查找这个节点肯定是找不到的,但是该节点的指针依旧是存在的,该指针所对应的内存中的信息都不应该被清空的吧?
事实上,当这个节点的所有引用都已经被去除之后,节点将被立即卸载(除非使用了DeleteHandler来管理),它所对应的所有内存空间以及子节点数据都将被立即释放。因此您这里的理解是错误的
继承了一个新类会对这个函数有什么影响么
没什么影响

该用户从未签到

 楼主| 发表于 2011-3-7 13:18:36 | 显示全部楼层
回复 4# array


    非常感谢您的回复,我冒昧地再进一步问一下,我主要想实现的功能是这样的:
    原来的场景树是这样子:
    原来的场景.jpg
     我在程序中需要动态将场景树变成这个样子:
      后来的场景树.jpg
    那我的程序该怎么写呢?如果先remove的话再add上去的话,正如您所说的,里面的信息就被清空了,肯定不对;但如果先将mt19和currentCollisionMt挂到tempDynamicMt上,然后将tempDynamicMt挂到根节点上,但因为我不希望mt19和currentCollisionMt不再直接挂在mRoot上面,那么这里是要用
    mRoot->removeChild(mt19);
    mRoot->removeChild(currentCollisionMt);
    这两句话把他们与树根的关系给切断吧。但这时候又有一个疑问了,如果再这里remove掉这个,那新的场景树中的tempDynamicMt的下面还有mt19以及currentCollisionMt节点么?

    谢谢指教~~~

该用户从未签到

 楼主| 发表于 2011-3-7 13:20:05 | 显示全部楼层
回复 3# girlkoo


    我以前也是用的您这样的方法,可是效果并不如我预期,于是我改成了我现在用的方法。如帖子所说,以前这个节点类型直接是mt的,我现在只是换成了他的子类CPart的,就出现了这样的情况,所以我非常费解~~~

该用户从未签到

发表于 2011-3-7 17:16:31 | 显示全部楼层
那新的场景树中的tempDynamicMt的下面还有mt19以及currentCollisionMt节点么?
当然有!因为tempDynamicMt已经引用它们了。只要时刻记得节点引用计数的概念,就会发现理解这些一点也不难。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表