查看: 1301|回复: 1

关于移除节点更新回调的疑问

[复制链接]

该用户从未签到

发表于 2010-7-13 10:25:44 | 显示全部楼层 |阅读模式
参考下面的帖子实现了一个模型的淡入操作的更新回调类
http://www.osgchina.org/bbs/viewthread.php?tid=1314&highlight=%B5%AD
对调度进来的节点(程序能够正确得到当前调度的节点)并设置更新回调:

  1. virtual void operator()(osg::Node* node ,osg::NodeVisitor* nv)
  2. {
  3. node->getOrCreateStateSet()->setAttributeAndModes(blendFunc,osg::StateAttribute::ON);
  4. node->getOrCreateStateSet()->setAttributeAndModes(blendColor,osg::StateAttribute::ON);
  5. if (alpha > 1)
  6. {
  7. //node->setUpdateCallback(NULL);
  8. node->removeUpdateCallback(this);
  9. alpha = 0.0f;
  10. }
  11. else
  12. {
  13. alpha += 0.01;
  14. blendColor->setConstantColor(osg::Vec4(1, 1, 1,alpha));
  15. }
  16. traverse( node, nv );
  17. }
复制代码


当alpha大于1时,就采用如上方法移除掉node的更新回调。
该更新回调类的对象,使用了一个全局变量:
Lodnode->setUpdateCallback(g_fadecallback);//g_fadecallback使用智能指针
结果发现,节点并没有成功将更新回调移除掉
已经调度到场景的节点和刚调度的节点均有淡入操作
按照思路:已经调度到场景的节点是不会再执行淡入操作的:
node->removeUpdateCallback(this);

后来,我将执行更新回调的类使用局部变量:
Lodnode->setUpdateCallback(new FadeCallback);
更新回调类不做任何修改
结果就和我预想的一致

调试发现执行removeUpdateCallback和setUpdateCallback(NULL)等效
就是将节点当前的更新回调置空

造成如上差别的原因:个人猜测跟智能指针的使用有关,不知是否正确,请大家多指教,谢谢。

该用户从未签到

发表于 2010-7-18 15:07:13 | 显示全部楼层
我不是特别理解您的两种思路的具体做法。全局量使用智能指针的话,在程序结束之前或者全局量被设置为NULL之前,它是不会被卸载的,因为始终有一个引用存在
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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