查看: 1054|回复: 7

Callback回调底层是怎么实现的???

[复制链接]

该用户从未签到

发表于 2014-6-19 15:14:28 | 显示全部楼层 |阅读模式
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

该用户从未签到

发表于 2014-6-19 15:28:12 | 显示全部楼层
osgViewer::Viewer::eventTraversal() 应该是在这个里面

该用户从未签到

 楼主| 发表于 2014-6-19 22:58:33 | 显示全部楼层
xueyu200 发表于 2014-6-19 15:28
osgViewer::Viewer::eventTraversal() 应该是在这个里面

void  addObserver (Observer *observer)
  Add a Observer that is observing this object, notify the Observer when this object gets deleted.

void  removeObserver (Observer *observer)
  Add a Observer that is observing this object, notify the Observer when this object gets deleted.  

这俩个函数什么意思???

该用户从未签到

发表于 2014-6-20 10:36:38 | 显示全部楼层
Observer 好像是一个析构通知类,当对象被析构的时候,会调用objectDeleted方法。
根据osg代码里面的osg::State来看,State里面包含一个Program:erContextProgram的vector _appliedProgramObjectSet,那么当Program::PerContextProgram在State外部被释放掉的时候,State将触发objectDeleted方法,将该Program::PerContextProgram从_appliedProgramObjectSet中删除,始终确保_appliedProgramObjectSet中的对象是有效的

该用户从未签到

发表于 2014-6-20 10:40:15 | 显示全部楼层
addObserver 是用来启用监听回调,removeObserver 释放监听回调,以Program:erContextProgram为例,它在添加到State中时,调用addObserver (osg::State),这样当PerContextProgram释放时,会触发State的objectDeleted,当调用了removeObserver(osg::State)后,PerContextProgram释放时,不会触发State的objectDeleted

该用户从未签到

发表于 2014-6-20 10:45:25 | 显示全部楼层
Observer的使用情境,应该是在需要维护std::vector<osg::Referenced*>列表中的对象的有效性时,使用的。它与std::vector<osg::ref_ptr<osg::Referenced>>的区别是,不会对对象的计数造成影响

该用户从未签到

 楼主| 发表于 2014-6-20 11:37:03 | 显示全部楼层
xueyu200 发表于 2014-6-20 10:45
Observer的使用情境,应该是在需要维护std::vector列表中的对象的有效性时,使用的。它与std::vector的区别 ...

virtual bool osgGA::GUIEventHandler::handle  ( const GUIEventAdapter &  ea,  
  GUIActionAdapter &  aa,  
  osg::Object *  ,  
  osg::NodeVisitor *     
)

virtual bool osgGA::GUIEventHandler::handle  ( const GUIEventAdapter &  ,  
  GUIActionAdapter &     
)
这俩个函数区别是啥?

该用户从未签到

发表于 2014-6-20 11:57:59 | 显示全部楼层
oirrm 发表于 2014-6-20 11:37
virtual bool osgGA::GUIEventHandler::handle  ( const GUIEventAdapter &  ea,  
  GUIActionAdapter  ...

这个不是很清楚哟,看代码来讲的话,好像没有类来重载bool handle(const GUIEventAdapter& ea,GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*),所以无法评估它的使用情境。唯一估计有用的是,触发GUIEventHandler的operator()(Node* node, NodeVisitor* nv)方法,会在handle(const GUIEventAdapter& ea,GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*)中截获到,估计按照这个思路延续下去,会有一定用途吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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