在场景中涉及大量数据加载时,我用类似以下的模式:
首选,我重写了osg::NodeCallback类,如下
class DataOperaterCallBack: public osg::NodeCallback
~DataOperaterCallBack(){}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);//必须实现的关键函数
void getDataOperator(DataOperator& _DataOperator){_DataOperator=m_DataOperator;}
void setDataOperator(const DataOperator& _DataOperator){m_DataOperator=_DataOperator;}
void getDataSource(DataSource& _DataSource){_DataSource=m_DataSource;}
void setDataSource(const DataSource& _DataSource){m_DataSource=_DataSource;}
DataOperator m_DataOperator;//数据操作状态
DataSource m_DataSource;//数据源,这样声明就有了先后依赖性
};
实现operator()虚函数
void DataOperaterCallBack::operator ()(osg::Node *node, osg::NodeVisitor *nv)
osg::ref_ptr<osg::Group> scenedata=dynamic_cast<osg::Group*>(node);
_reader.Reader(m_DataSource,scenedata);
}
加载数据时调用这个类,如下:
osg::ref_ptr<DataOperaterCallBack> m_SceneNodeCallback=new DataOperaterCallBack;
m_SceneNodeCallback.get()->setDataSource(_dataSource);
m_SceneNodeCallback.get()->setDataOperator(ADDOPTION);
m_SceneData.get()->setUpdateCallback(m_SceneNodeCallback);
通过这种方法实现加载节点,会比
m_SceneData.get()->AddChild(..)性能好一点,可是有时还是免不了出错,那么还有其它方法,请高手提供一些思路。
另外:
在以上代码中
1、osg::ref_ptr<osg::Group> scenedata=dynamic_cast<osg::Group*>(node); 的转换代价有多大,而且不明白,为什么可以这样,因为C++里是“没有从基类到派生类的转换”?
2、在这个类中实现Operator(),我把traverse(node,nv)去掉了,如果不去掉会问题的,加上traverse(node,nv)在这里会起什么作用呢? |