|
本帖最后由 dlhuaan 于 2013-7-26 14:17 编辑
array、各位大侠:
看了你的cookbook中 firebreath+osg 第二个例子,下面是我对该例子的理解:
例子中利用CommandHandler 从“UI(我理解就是firebreath)线程”发送给“osg渲染线程(仅在GUIEventAdapter::FRAME操作 )”指令command。
该command是线程间共享的,会产生读写冲突,所以采用command buffer机制在两个线程中传递command。
---------------------------------------------------------------------------------------------------------------------------------
问题1:
现在我用pick(即computeIntersections),不存在command传递问题,firebreath还是崩溃了,下面是添加在你的例子2源代码中的测试代码:
virtual bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
{
if ( ea.getEventType()!=osgGA::GUIEventAdapter::FRAME )
return false;
std::vector<std::string> localCommands;
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mutex);
localCommands.swap( commands );//清空commands
}
osgViewer::View* view1 = static_cast<osgViewer::View *>( &aa );
if ( view1 )
{
for ( unsigned int i=0; i<localCommands.size(); ++i )
{
osgUtil:ineSegmentIntersector::Intersections intersections;
if (view1->computeIntersections(400, 300, intersections))
{
}
}
}
return false;
}
只要一运行view1->computeIntersections(400, 300, intersections),程序就通过不了,
就算是加上
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mutex);
osgUtil::LineSegmentIntersector::Intersections intersections;
if (view1->computeIntersections(400, 300, intersections))
{
}
}
也不行,问题出在哪?求思路?
-----------------------------------------------------------------------------------------------
问题2:
firebreath+osg程序,要修改osg中数据,如addchild、removechild等,非得在GUIEventAdapter::FRAME中吗?
论坛里也有别的用户问过类似问题,个人觉得pick问题不解决很约束firebreath+osg的使用。
|
|