查看: 2178|回复: 7

更新回调中 root->addChild问题

[复制链接]

该用户从未签到

发表于 2011-8-15 17:10:19 | 显示全部楼层 |阅读模式
写了一个更新回调,operator()中的操作就是向root添加子节点

每次运行到这里就崩溃了

  1. class CCtrSceneCallback : public osg::NodeCallback
  2. {
  3. public:
  4. CCtrSceneCallback()
  5. : _ctrNode(0)
  6. // , _childNode(NULL)
  7. {
  8. _childNode = new osg::Node();

  9. }

  10. virtual void operator()( osg::Node* node,osg::NodeVisitor* nv )
  11. {
  12. if (_ctrNode > 0)
  13. {
  14. osg::Group* root = dynamic_cast<osg::Group*> (node);

  15. if (_ctrNode == 1)
  16. {
  17. root->addChild(_childNode);
  18. }
  19. else if (_ctrNode == 2)
  20. {
  21. root->removeChild(_childNode);
  22. }
  23. _ctrNode = 0;
  24. }

  25. // 继续遍历节点
  26. traverse( node, nv );

  27. }

  28. void setChildNode(osg::Node* child,int mode)
  29. {
  30. _childNode = child;
  31. _ctrNode = mode;
  32. }

  33. protected:
  34. osg::Node* _childNode;
  35. int _ctrNode;
  36. };
复制代码


在外部通过调用void setChildNode(osg::Node* child,int mode)
更改_childNode,并控制_ctrNode
结果每次运行到root->addChild(_childNode);程序都中断

该用户从未签到

发表于 2011-8-16 08:20:47 | 显示全部楼层
您提供的信息严重不足,这段代码本身没有什么值得关注的地方

该用户从未签到

 楼主| 发表于 2011-8-16 08:34:32 | 显示全部楼层
回复 2# array



  1. m_Ctr = new CCtrSceneCallback();
  2. mRoot = new osg::Group;
  3. mRoot 1 = new osg::Group;
  4. mRoot1->setDataVariance(osg::Object::DYNAMIC);
  5. mRoot1->setUpdateCallback(m_Ctr);
复制代码


然后再一个mfc按钮的消息中

  1. m_Ctr->setChildNode(pagelod,1);
复制代码

pagelod是一个有效节点,下面添加了一个node

该用户从未签到

 楼主| 发表于 2011-8-16 11:55:48 | 显示全部楼层
差不多明白了

m_Ctr->setChildNode(pagelod.get(),1);

因为是更新回调,会在下一次更新里执行addchild,由于是智能指针的缘故,当前pagelod没有被引用,所以会在下一次更新遍历前被释放

大概是这个原因 还在探索中

该用户从未签到

 楼主| 发表于 2011-8-16 11:59:01 | 显示全部楼层
解决办法就是
pagelod使用普通指针
由于在下一次更新遍历时将会作为child添加,所以也不会产生内存泄露的问题

该用户从未签到

发表于 2011-8-17 09:54:05 | 显示全部楼层
  1. protected:
  2. osg::Node* _childNode;
复制代码
这里改用ref_ptr来管理也可以

该用户从未签到

 楼主| 发表于 2011-8-17 14:14:08 | 显示全部楼层
谢谢 Array

该用户从未签到

发表于 2011-8-17 14:48:25 | 显示全部楼层
dynamic了没有
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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