场景数据动态更新的核心就是设置数据变度属性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);因此,我们可以说过多的更新回调会造成系统的渲染效率在一定程度上降低,不过即使在非常极端的情况下,也不会低于单线程模式的效率。