osg 场景节点(事件,更新,裁剪)遍历状态开启机制

您所在的位置:网站首页 unityfairyguiglist设置默认遍历事件 osg 场景节点(事件,更新,裁剪)遍历状态开启机制

osg 场景节点(事件,更新,裁剪)遍历状态开启机制

2024-06-20 17:05| 来源: 网络整理| 查看: 265

OSG 显示引擎为优化其显示效率,节点的更新遍历,事件处理遍历默认情况下是关闭的,内部通过更新计数来控制是否将事件处理,节点更新应用到子场景中。

void Node::setUpdateCallback(Callback* nc);

void Node::setEventCallback(Callback* nc);

void Node::setCullingActive(bool active);

下面我们看,新节点先加入到场景图中再设置回调函数  与 新节点设置回调函数再加入到场景图中  控制计数的改变有何不同:

a) 新节点先加入到场景图中再设置回调函数

    新节点添加前没有设置回调函数:                                                                        bool Group::addChild( Node *child ) { return Group::insertChild( _children.size(), child ); } bool Group::insertChild( unsigned int index, Node *child ) { if (!child) return false; #if ENSURE_CHILD_IS_UNIQUE if (containsNode(child)) { OSG_WARNsetNumChildrenRequiringUpdateTraversal( (*itr)->getNumChildrenRequiringUpdateTraversal()+delta ); } } } // set the app callback itself. _updateCallback = nc; }

从红色代码处可以看出,当节点已关联回调函数,再次设置新的回调函数时,不会影响父节点的遍历控制计数。

b)新节点设置回调函数再加入到场景图中

void Node::setUpdateCallback(Callback* nc) bool Group::insertChild( unsigned int index, Node *child )

    从以上两个函数中可以看出,父节点遍历控制计数的改变是在加入到场景图中时自动处理的, 给节点设置回调函数或更改节点遍历控制计数都能将遍历下放到子节点,这两种方式有各自的用途,比如,我们需要在节点的virtual void traverse(osg::NodeVisitor& nv) 方法中处理所有的遍历情况,但该节点没有设置相关的回调函数或是子节点的访问是在过程中完成的,而不是串在场景图中,这里我们只需要将父节点遍历控制计数设置成大于0的数,节点遍历就会由根节点往下传递。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3