場景數據的動態更新
動態更新的核心就是設置數據變度屬性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);
...
// 渲染過程中可以動態改變文字的位置和內容等屬性
{