osgUtil.dereference_clear
是开源三维图形库 OpenSceneGraph 中 osgUtil
命名空间下的一个类,它用来在 OpenSceneGraph 场景图中自动删除未被引用的节点,并在删除节点之前释放指向该节点的指针。此操作可有效减小程序的内存占用。
#include <osgUtil/DereferenceVisitor>
...
osgUtil::DereferenceVisitor dv;
rootNode->accept(dv);
参数 | 描述 |
---|---|
rootNode | 要遍历的根节点 |
当 OpenSceneGraph 场景中的节点被删除时,虽然节点本身会被销毁,但向该节点的指针不会自动被释放。这就可能导致一些未被引用的节点在内存中一直占据一定的空间,从而导致程序崩溃或内存泄漏。
osgUtil.dereference_clear
类可以自动遍历整个场景图,找到未被引用的节点并删除它们。同时,该类还会在删除节点之前释放指向该节点的指针,以防止内存泄漏。
osgUtil/DereferenceVisitor
头文件包含到你的程序中。osgUtil::DereferenceVisitor
对象。accept
函数,传入你要遍历的根节点。osgUtil.dereference_clear
会遍历整个场景图,删除未被引用的节点。osgUtil.dereference_clear
时根节点不能同时被改变。#include <osg/Group>
#include <osgDB/ReadFile>
#include <osgUtil/DereferenceVisitor>
int main()
{
// 加载场景
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/some_model.ive");
// 创建遍历器
osgUtil::DereferenceVisitor deref_visitor;
// 遍历场景并删除未被引用的节点
model->accept(deref_visitor);
// 将场景设置为渲染对象并返回
osg::ref_ptr<osg::Group> scene = new osg::Group;
scene->addChild(model);
return scene.release();
}
osg::Node
:场景图节点osg::Group
:节点组,可用于包含其它节点osgDB::readNodeFile
:从文件中读取一个场景节点osgViewer::Viewer
:内置 OpenSceneGraph 渲染器,可用于查看场景图效果