查看: 692|回复: 3

FireBreath的Pick导致浏览器崩溃问题

[复制链接]

该用户从未签到

发表于 2016-3-23 19:41:23 | 显示全部楼层 |阅读模式
有好多同行遇到这个问题,经过一段时间的探索,和向Array神的请教,断定IE浏览器崩溃原因就是线程共享问题。需要添加命令缓存来解决。Pick的双击拣选节点解决问题方法如下:
bool osgWebPlugin:nMouseDown(FB::MouseDownEvent *evt, FB:luginWindow *win)
{
        FB::PluginWindowWin* window = reinterpret_cast<FB::PluginWindowWin*>(win);
        if (window)
        {
                if(m_OperHandler) m_OperHandler->addCommond(osg::Vec2(evt->m_x,evt->m_y));
        }
        return false;
}

在一个handler里面添加命令缓存。。

handler里面处理如下:
                std::vector<osg::Vec2> pos;
                OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex);
                pos.swap(m_command);

                float x = ea.getX();
                float y = ea.getY();

                if (!viewer->computeIntersections(x,y,m_intersections)) return false;
                for(LineIntersecions::iterator hitr = m_intersections.begin();
这样处理 求交时 就不会出现崩溃问题。。。注意最好把交点集合设置为成员变量m_intersections。
我就是这样解决的。希望对大家有所帮助。。

该用户从未签到

发表于 2016-3-24 10:14:07 | 显示全部楼层
仅仅看你提供的代码,个人感觉,你的问题的解决并不是那个临时变量pos在起作用,感觉你理解错了array 的意思!你pick操作都在event遍历中做了,pick时主线程并没有操作场景数据,压根不存在线程之间互斥!

该用户从未签到

 楼主| 发表于 2016-3-25 08:50:55 | 显示全部楼层
meifazhu1 发表于 2016-3-24 10:14
仅仅看你提供的代码,个人感觉,你的问题的解决并不是那个临时变量pos在起作用,感觉你理解错了array 的意 ...

  if (!viewer->computeIntersections(x,y,m_intersections)) return false;  求交函数不是访问场景数据吗???我在质疑。。

该用户从未签到

 楼主| 发表于 2016-3-28 20:41:21 | 显示全部楼层
界面刷新时,还是出现崩溃问题。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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