OSG中的DataVariance

场景数据动态更新的核心就是设置数据变度属性DataVariance,它决定了OSG在多线程渲染的过程中的执行策略:只有所有DYNAMIC属性的对象被渲染完毕之后,OSG才会开始执行下一帧的用户更新操作;这样有效地可以避免数据的过快更新造成当前的渲染动作出错,以致系统崩溃。

所有派生自osg::Object的对象都可以设置数据变度的属性,通常设置的时机在新建对象之时,例如:
osg::ref_ptr<osg::Group>
node = new
osg::Group;
node->setDataVariance(osg::Object::DYNAMIC);
...

这就意味着这个组节点可能在渲染过程中发生变动,可能变动的内容包括:成员属性的改变,新增/替换/删除子节点,或者使用事件/更新/裁减回调实现的自定义变动。

数据变度的设置对于渲染状态和纹理的动态更新同样有重要的意义。而对于osg::Drawable对象,设置为动态更新意味着它可能在渲染过程中发生顶点属性或者图元的变化;这其中尤为要提及osgText::Text,文字属性的变化必须预先设置动态的数据变度属性,否则可能造成系统运行过程中崩溃:
osg::ref_ptr<osgText::Text>
text = new
osgText::Text;
text->setDataVariance(osg::Object::DYNAMIC);
...
// 渲染过程中可以动态改变文字的位置和内容等属性
{
    text->setPosition( ... );
    text->setText( ... );
}

数据变度不能被自动继承。它事实上只有STATIC和DYNAMIC两个可选值,而UNSPECIFIED意味着系统将自动根据初始化时的情况给对象设置数据变度的属性。默认情况下,任何新建对象都是UNSPECIFIED的,如果系统在第一次执行渲染前发现它附带有更新/事件/裁减回调对象的话,则会自动给它设置setDataVariance(osg::Object::DYNAMIC);因此,我们可以说过多的更新回调会造成系统的渲染效率在一定程度上降低,不过即使在非常极端的情况下,也不会低于单线程模式的效率。

OSG中的DataVariance

时间: 2025-01-05 15:21:34

OSG中的DataVariance的相关文章

OSG中相机参数的更改

[cpp] view plain copy #pragma comment(lib, "osg.lib") #pragma comment(lib, "osgDB.lib") #pragma comment(lib, "osgViewer.lib") #include  "osgViewer/Viewer" #include  "osgDB/ReadFile" #include  "osg/Nod

osg项目经验1&lt;MFC+OSG中模型点选效果&gt;

点选主要是重载osg的GUIEventHandler, 1 class CPickHandler : public osgGA::GUIEventHandler{ //自定义回调函数名:CPickHandler 2 osgViewer::Viewer * mViewer; //在这里定义要在重载函数里使用的变量 3 osg::Group * mGroup; 4 osg::Node * lastSelect; 5 osg::Node * replacedNode; 6 int replaceNum

OSG中找到特定节点的方法(转)

OSG中找到特定节点的方法 为了在OSG中找到需要的节点并对节点做出相应的操作,可以从NodeVisitor类中继承一个类,NPS的教程 [download id="14"] 阐述了这个问题.下面是我写的一个类,找到指定名字.指定类型的节点: class findGeoNamedNode: public osg::NodeVisitor { public: findGeoNamedNode(); findGeoNamedNode(const std::string name): osg

OSG 中 相交测试 模块 工作流程及原理

主要涉及三个类: 1. osgUtil::PolytopeIntersector // 具体不同算法实现类 2. osgUtil::IntersectionVisitor //用来遍历节点树的每个节点 3.osg::Node * mNode;  //  你要做相交测试的根节点 先看用法: osg::ref_ptr<osgUtil::PolytopeIntersector> intersector = new osgUtil::PolytopeIntersector(osgUtil::Inter

怎样在osg中动态的设置drawable的最近最远裁剪面

// draw callback that will tweak the far clipping plane just    // before rendering a drawable.    struct OverrideNearFarValuesCallback : public osg::Drawable::DrawCallback    {        OverrideNearFarValuesCallback(double radius)            : _radius

osg中使用MatrixTransform来实现模型的平移/旋转/缩放

osg中使用MatrixTransform来实现模型的平移/旋转/缩放 转自:http://www.cnblogs.com/kekec/archive/2011/08/15/2139893.html#undefined MatrixTransform是从Transform - Group继承而来,因此可以在它的下面挂接Node对象. 通过设置其矩阵,来实现其下子节点的模型变换. -- 用局部坐标系来理解(局部坐标系又称惯性坐标系,其与模型的相对位置在变换的过程中始终不变) 如下代码: // 创建

OSG 中 常用的 Uniforms

osg中的 Uniforms主要存在两个地方,一个是SceneView中,void SceneView::updateUniforms() void SceneView::updateUniforms() { if (!_localStateSet) { _localStateSet = new osg::StateSet; } if (!_localStateSet) return; if ((_activeUniforms & FRAME_NUMBER_UNIFORM) &&

OSG中找到特定节点的方法

OSG中找到特定节点的方法 转自:http://38288890.blog.163.com/blog/static/19612845320072721549504/ 为了在OSG中找到需要的节点并对节点做出相应的操作,可以从NodeVisitor类中继承一个类,NPS的教程 [download id="14"]阐述了这个问题.下面是我写的一个类,找到指定名字.指定类型的节点:class findGeoNamedNode:public osg::NodeVisitor{public:fi

OSG中的智能指针

在OpenSceneGraph中,智能指针(Smart pointer)的概念指的是一种类的模板,它针对某一特定类型的对象(即Referenced类及其派生类)构建,提供了自己的管理模式,以避免因为用户使用new运算符创建对象实例之后,没有及时用delete运算符释放对象,而造成部分内存空间被浪费的后果,也就是所谓的内存泄露错误. 由于OSG中与场景图形有关的大多数类均派生自Referenced类,因此OSG大量使用了智能指针来实现场景图形节点的管理.智能指针的使用为用户提供了一种自动内存释放的